UIButton не работает, когда он находится в UIScrollView
Моя структура просмотров:
UITableView
UITableViewCell
UIScrollView
CustomView
UIButton
Проблема заключается в том, что UIButton не работает, когда я касаюсь его.
Я создаю его с кодом:
btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
btn.layer.zPosition = 1;
[self addSubview:btn];
Я также добавил:
scroll.delaysContentTouches = NO;
scroll.canCancelContentTouches = NO;
Но моя кнопка не работает. Я не могу отменитьContentTouches или установить задержку для UITableView, потому что, если я его установлю, UITableView прекратит прокрутку по вертикали.
Спасибо за любую помощь!
Ответы
Ответ 1
Создайте подкласс UIScrollview с помощью
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return NO;
}
Если вы не получили это сообщение, установите:
scrollView.delaysContentTouches = NO;
Проблема заключается в том, что по умолчанию поведение touchesShouldCancelInContentView
ведет себя по умолчанию, оно возвращает NO, только если subview является UIControl, но ваша кнопка скрыта внутри CustomView, которая не является.
Ответ 2
Произошел один и тот же сценарий. UIScrollView в отдельном классе и кнопку добавления через пользовательский вид. "NSNotificationCenter" помог мне решить проблему.
Пример кода:
-(void)tileTouchUpInside:(id)sender
{
NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"];
[[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict];
}
В классе, содержащем вид прокрутки:
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil];
}
-(void)doAction:(NSNotification *) notification
{
NSString* value =[notification.userInfo valueForKey:@"index"];
// .......
}
Включить userInteraction для просмотра прокрутки, пользовательского вида и кнопки.
Ответ 3
Я думаю, вам нужно установить рамку кнопки. По умолчанию, если вы используете метод btn = [[UIButton alloc] init];
для инициализации, это будет UIButtonTypeCustom
. Также установите для него цвет фона для цели отладки, чтобы отметить, где находится кнопка.
Теперь для вашего случая вам нужно установить кадр для этой кнопки, например btn.frame = CGRectMake(0,0,100,100);
Для внутреннего UIScrollView реализуем этот метод делегата.
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
return ![view isKindOfClass:[UIButton class]];
}
Это может сработать.
Ответ 4
Ваш кадр CustomView может мешать вашему UIButton. Они перекрываются? Добавьте свою кнопку в CustomView только для проверки на [CustomView addSubview:UIButton];
(используя ваши значения, конечно). Если это сработает, ваша проблема, скорее всего, будет перекрываться.
Ответ 5
Ссылка из Capt.Hook помогла мне. Я использовал UIGestureRecognizer вместо UIButtons.
Разрешить UIScrollView и его подзаголовкам реагировать на сенсорное взаимодействие
Используйте его, если у вас есть аналогичная проблема.
Ответ 6
Добавьте все подпрограммы из CustomView в ScrollView. И скройте CustomView. Убедитесь, что CustomView (ContainerView scrollView) также должен быть подвид прокрутки.
Ответ 7
У меня была такая же проблема и одинаковая иерархия представлений. С последним sdk просто используйте его:
Установка задержекContentTouches для NO для UIButton в том же UITableViewCell.
self.tableView.delaysContentTouches = NO