我有一个包含 UIButton 的自定义 UITableViewCell,并且单元格本身响应 UIControlEventTouchUpInside。该单元格在 iPhone 模拟器和所有版本的 iPhone(iPhone5 除外)中的行为应如此。出于某种原因,在 iPhone5 上,单元格仅响应单元格最底部的触摸。事实上,用户要真正让单元格对触摸做出响应是极其困难的,他们必须在单元格底部附近多次点击才能使其响应。此外,UIButton 在 iPhone5 上根本没有响应。我还应该补充一点,这个错误只是在应用程序经过优化以适应 iPhone5 更大的视网膜屏幕后才开始发生的。我倾向于认为这与单元格的大小有关,但它在 iPhone 5 上的外观看起来与它应该的完全一样。我还尝试通过创建一个单独的 NIB 来解决这个问题,以便在使用 iPhone5 时进行实例化,这利用了“自动布局”界面生成器功能,但这并没有解决任何问题。
这是在 ViewController.m 中实例化自定义 UITableView 单元格的代码:
// Configure the cell...
switch (indexPath.section) {
case 0: // Full name
{
UINib *nib = [UINib nibWithNibName:@"ProfileNameCell" bundle:nil];
cell = [[nib instantiateWithOwner:nil options:nil] objectAtIndex:0];
[[(ProfileNameCell *)cell nameLabel] setText:[NSString stringWithFormat:@"%@ %@",
[[[Engine sharedInstance] currentUser] firstname],
[[[Engine sharedInstance] currentUser] lastname]]];
[[(ProfileNameCell *)cell imageButton] addTarget:self
action:@selector(selectUserPhoto:)
forControlEvents:UIControlEventTouchUpInside];
if ([[[Engine sharedInstance] currentUser] photoURL] != nil) {
[(ProfileNameCell *)cell setImageForURL:
[NSURL URLWithString:[[[Engine sharedInstance] currentUser] photoURL]]];
}
break;
}...
这是 View.m 的代码:
@implementation ProfileNameCell
@synthesize imageView=imageView_;
@synthesize imageButton;
@synthesize nameLabel;
- (void)awakeFromNib {
[(CALayer *)[self.imageView layer] setCornerRadius:5.0];
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code.
[(CALayer *)[imageView_ layer] setCornerRadius:5.0];
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state.
}
- (void)setImageForURL:(NSURL *)url {
[NSThread performBlockInBackground:^{
//Code that is executed when the UIButton is pressed...
}
- (void)dealloc {
[imageView_ release];
[imageButton release];
[nameLabel release];
[super dealloc];
}
@end