UIButton performance in UITableViewCell vs UIView

Posted by marcel salathe on Stack Overflow See other posts from Stack Overflow or by marcel salathe
Published on 2012-10-10T01:43:21Z Indexed on 2012/10/10 3:37 UTC
Read the original article Hit count: 184

Filed under:
|
|

I'd like to add a UIButton to a custom UITableViewCell (programmatically). This is easy to do, but I'm finding that the "performance" of the button in the cell is slow - that is, when I touch the button, there is quite a bit of delay until the button visually goes into the highlighted state. The same type of button on a regular UIView is very responsive in comparison.

In order to isolate the problem, I've created two views - one is a simple UIView, the other is a UITableView with only one UITableViewCell. I've added buttons to both views (the UIView and the UITableViewCell), and the performance difference is quite striking.

I've searched the web and read the Apple docs but haven't really found the cause of the problem. My guess is that it somehow has to do with the responder chain, but I can't quite put my finger on it. I must be doing something wrong, and I'd appreciate any help. Thanks.

Demo code:

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property UITableView* myTableView;
@property UIView* myView;

ViewController.m

#import "ViewController.h"
#import "CustomCell.h"

@implementation ViewController

@synthesize myTableView, myView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self initMyView];
        [self initMyTableView];
    }
    return self;
}

- (void) initMyView {
    UIView* newView = [[UIView alloc] initWithFrame:CGRectMake(0,0,[[UIScreen mainScreen] bounds].size.width,100)];
    self.myView = newView;
    // button on regularView
    UIButton* myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [myButton addTarget:self action:@selector(pressedMyButton) forControlEvents:UIControlEventTouchUpInside];
    [myButton setTitle:@"I'm fast" forState:UIControlStateNormal];
    [myButton setFrame:CGRectMake(20.0, 10.0, 160.0, 30.0)];
    [[self myView] addSubview:myButton];
}

- (void) initMyTableView {
    UITableView *newTableView = [[UITableView alloc] initWithFrame:CGRectMake(0,100,[[UIScreen mainScreen] bounds].size.width,[[UIScreen mainScreen] bounds].size.height-100) style:UITableViewStyleGrouped];
    self.myTableView = newTableView;
    self.myTableView.delegate = self;
    self.myTableView.dataSource = self;
}

-(void) pressedMyButton {
    NSLog(@"pressedMyButton");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self view] addSubview:self.myView];
    [[self view] addSubview:self.myTableView];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    if (customCell == nil) {
       customCell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CustomCell"];
    }
    return customCell;
}

@end

CustomCell.h

#import <UIKit/UIKit.h>
@interface CustomCell : UITableViewCell
@property (retain, nonatomic) UIButton* cellButton;
@end

CustomCell.m

#import "CustomCell.h"

@implementation CustomCell

@synthesize cellButton;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // button within cell
        cellButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [cellButton addTarget:self action:@selector(pressedCellButton) forControlEvents:UIControlEventTouchUpInside];
        [cellButton setTitle:@"I'm sluggish" forState:UIControlStateNormal];
        [cellButton setFrame:CGRectMake(20.0, 10.0, 160.0, 30.0)];
        [self addSubview:cellButton];
    }
    return self;
}

- (void) pressedCellButton {
    NSLog(@"pressedCellButton");
}

@end

© Stack Overflow or respective owner

Related posts about ios

Related posts about uitableviewcell