2013-04-12 5 views
9

У меня проблема, похожая на this one, но ответ предоставлен там не очень помогает. У меня есть UITableView с некоторыми обычными UITableViewCells, эти ячейки имеют вложенный пользовательский UIViews и, наконец, некоторые UIButtons внутри. Проблема, как в вопросе, указанном выше, заключается в том, что когда я касаюсь кнопки, событие нажатия кнопки не заполняется до UITableView, и оно никогда не прокручивается.UIButton внутри UITableViewCell ворует касание от UITableView

Вот код (это просто быстрый способ воспроизведения, это не мой фактический код):

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 

@property (strong, nonatomic) IBOutlet UITableView * tableView; 

@end 

@implementation ViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 
                     self.view.bounds.size.width, 
                     self.view.bounds.size.height) 
                 style:UITableViewStylePlain]; 
     [self.view addSubview:self.tableView]; 
     self.tableView.delegate = self; 
     self.tableView.dataSource = self; 
    } 
    return self; 
} 

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell * cell = [[UITableViewCell alloc] init]; 
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.backgroundColor = [UIColor redColor]; 
    button.frame = CGRectMake(0, 0, 50, 44); 
    [cell.contentView addSubview:button]; 
    return cell; 
} 

@end 

Красная кнопка в единственной ячейке не позволит табличное подпрыгивать прокрутки.

Может ли кто-нибудь мне немного помочь?

P.S. Не обращайте внимания на тупость кода, который я предоставил, я знаю обо всех проблемах. Я просто предоставил его, чтобы показать, в чем проблема. Это конфликт buttonView и scrollView.

ответ

9

Это стандартное поведение UIScrollView, которые используют tableviews. Система не знает, что вы хотите прокручивать, пока вы не переместите свой палец, но к тому времени вы уже нажали на кнопку, и поэтому он предполагает, что это то, что вы хотите сделать.

Вы можете поиграть с несколькими свойствами в прокруткеview вашего стола, чтобы изменить поведение, но вы можете обнаружить, что они негативно влияют на ощущение ваших ячеек и кнопок из-за дополнительных задержек.

self.tableView.delaysContentTouches = YES; 

delaysContentTouches Если значение этого свойства YES, вид прокрутки задержки обработки сенсорный вниз жест, пока он не может определить, скроллинг намерение ...

и

self.tableView.canCancelContentTouches = YES 

canCancelContentTouches Если значение этого свойства равно YES, и в этом содержимом началось отслеживание касания пальцем пальца, и если пользователь перетаскивает палец достаточно, чтобы инициировать прокрутку, представление получает касаниеCancelled: withEvent: message и просмотр прокрутки обрабатывает касание как свиток.

+8

Я все еще не могу заставить это работать для 'UIControl' in 'UITableView's. Кроме того, поскольку 'UITableView' является подклассом' UIScrollView', ваш код должен быть 'self.tableView.canCancelContentTouches = YES;' – johnboiles

+1

@johnboiles вам следует установить elf.tableView.scrollView.delaysContentTouches = NO; – passol

+0

комбинация, показанная в ответе, здесь не работает. @johnboiles - это правильно. То, что только что сработало для меня, это: mytable.delaysContentTouches = false и mytable.canCancelContentTouches = true. Это заставило кнопку внутри моей ячейки работать как обычно. – zumzum

0

Ниже код работает для меня:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
cell = [tableView dequeueReusableCellWithIdentifier:@"cell_id"]; 
cell.userInteractionEnabled = YES; 
if (cell == nil) { 
    cell = [[[CustomCell1 alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell_id"]autorelease]; 
} 

[cell.button addTarget:self action:@selector(button_action) forControlEvents:UIControlEventTouchUpInside];} 

-(void)button_action{NSLog(@"Hello!");} 

Это мой обычай клетки:

#import "CustomCell.h" 
@implementation CustomCell 
@synthesize button; 


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ 
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
if (self) { 
    button = [[UIButton alloc]init]; 
    button =[UIColor redColor]; 
    [self.contentView addSubview: button]; 
      } 
return self;} 

- (void)layoutSubviews { 
[super layoutSubviews]; 
CGRect contentRect = self.contentView.bounds; 
CGFloat boundsX = contentRect.origin.x; 
CGRect frame; 
frame= CGRectMake(boundsX+50 ,+15, 100, 100); 
     button = frame;} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ [super setSelected:selected animated:animated]; 
// Configure the view for the selected state 
} 
+0

Ну, это не для меня - трогательная кнопка по-прежнему предотвращает прокрутку таблицыView. Спасибо, в любом случае. – DemoniacDeath

7

Вы можете изменить поведение путем переопределения касанийShouldCancelInContentView: в UITableView. Для этого вам нужно будет заменить представление таблицы на этот подкласс либо в loadView, либо в вашем xib-файле.

@interface AutoCancelTableView: UITableView 
@end 

@implementation AutoCancelTableView 

// 
// Overriding touchesShouldCanceInContentView changes the behaviour 
// of button selection in a table view to act like cell selection - 
// dragging while clicking a button will cancel the click and allow 
// the scrolling to occur 
// 
- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

@end 
+0

Спасибо yooooouuuuu! Теперь ячейки и кнопки в нижнем колонтитуле стола ведут себя точно так же ...;) – Trenskow

+0

Идеальный ответ, работайте как шарм. –

+0

Может подтвердить, что это работает. Просто не забудьте связать его с 'tableView.delaysContentTouches = false'. – mxcl

1

Потому что все вышеперечисленные ответы не работают для меня. Я добавляю ImageView на кнопку и создаю пользовательский интерфейс imageView YES, а затем добавлю жесты касания на iamgeView. В методах, связанных с жестов, я помещаю связанные кнопки.так что все хорошо .. может быть взломан. Но это хорошо работает.

Смежные вопросы