UIButton图层样式使应用程序变得缓慢

时间:2014-06-21 17:43:15

标签: ios objective-c xcode uitableview uibutton

我正在使用带可滚动单元格的UITableView。每个单元格包含近20到25个按钮,所有按钮都有边框颜色和半径。因此,我的视图控制器演示非常慢。滚动表格视图时,应用程序也会变得太慢。

创建后我尝试复制按钮。但重复按钮没有任何边框颜色/半径。这就是我给出图层样式和重用按钮的方式。

button.layer.cornerRadius = 5;
button.layer.borderWidth = 1.0f;
button.layer.masksToBounds = YES;
button.backgroundColor = CRICHQ_GREY;
button.layer.borderColor = [UIColor lightGrayColor].CGColor;

复制,

NSData *dataSave = [NSKeyedArchiver archivedDataWithRootObject:oldButton];
UIButton *clonedButton = [NSKeyedUnarchiver unarchiveObjectWithData:dataSave];

但是当我复制按钮时,我没有在clonedButton按钮中获得图层样式。它给了我简单的按钮,所以我应该再次添加图层属性。

我搜索了许多链接,但我没有得到任何好的解决方案。任何帮助将不胜感激。 提前致谢。

1 个答案:

答案 0 :(得分:3)

我不确定您对使用背景图片而不是图层的反对意见,但我尝试了这一点,并且它使设备上的滚动性能更好。表视图控制器的初始加载仍然有点慢,但后续加载速度很快。这是我用于测试的单元类中的代码,

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.layer.cornerRadius = 5;
        button.layer.borderWidth = 2.0f;
        button.layer.masksToBounds = YES;
        button.backgroundColor = [UIColor yellowColor];
        button.layer.borderColor = [UIColor darkGrayColor].CGColor;
        button.frame = CGRectMake(0,0, 50, 44);
        UIImage *bg = [self imageWithView:button];

        for (int i = 0; i<5; i++) {
            for (int j = 0; j<5; j++) {
                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                NSString *title = [NSString stringWithFormat:@"BT-%d", j*5 + i];
                [button setTitle:title forState:UIControlStateNormal];
                [button addTarget:self action:@selector(doStuff:) forControlEvents:UIControlEventTouchUpInside];
                button.backgroundColor = [UIColor colorWithPatternImage:bg];
                button.frame = CGRectMake(60*i + 16, 50*j + 5, 50, 44);
                [self.contentView addSubview:button];
            }
        }
    }
    return self;
}


- (UIImage *)imageWithView:(UIView *)view {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.bounds.size.width, view.bounds.size.height), view.opaque, [[UIScreen mainScreen] scale]);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}