Подтвердить что ты не робот

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 прекратит прокрутку по вертикали.

Спасибо за любую помощь!

4b9b3361

Ответ 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]; (используя ваши значения, конечно). Если это сработает, ваша проблема, скорее всего, будет перекрываться.

Ответ 6

Добавьте все подпрограммы из CustomView в ScrollView. И скройте CustomView. Убедитесь, что CustomView (ContainerView scrollView) также должен быть подвид прокрутки.

Ответ 7

У меня была такая же проблема и одинаковая иерархия представлений. С последним sdk просто используйте его:

Установка задержекContentTouches для NO для UIButton в том же UITableViewCell.

self.tableView.delaysContentTouches = NO