UIButton не работает, когда он находится в UIScrollView

17

Моя структура просмотров:

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

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

задан George 20.05.2013 в 14:33
источник
  • вы внедрили метод tileTouchUpInside? –  Ahmed Z. 20.05.2013 в 14:48
  • Является ли userInteractionEnabled YES для CustomView? –  Capt. Hook 20.05.2013 в 15:01
  • @AhmedZ. - Конечно –  George 20.05.2013 в 15:07
  • @ Capt.Hook - спасибо, я пробовал, не помог. Кроме того, хотите добавить - когда я просто добавляю CustomView в ViewController, с вашим прокруткой, он отлично работает. Он останавливается, если он помещен в scrollview. –  George 20.05.2013 в 15:09
  • Проверьте этот вопрос: разрешите UIScrollView и его подзаголовкам отвечать на прикосновение –  Capt. Hook 20.05.2013 в 15:17

8 ответов

19

Создайте подкласс UIScrollview с помощью

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
  return NO;
}

Если вы не получили это сообщение, установите:

scrollView.delaysContentTouches = NO;

Проблема заключается в том, что по умолчанию touchesShouldCancelInContentView ведет себя по умолчанию, он возвращает NO, только если subview является UIControl, но ваша кнопка скрыта внутри CustomView, которая не является.

    
ответ дан Capt. Hook 20.05.2013 в 15:26
  • Вы также можете отключить опцию Delays content touches в IB. Это помогло мне. –  jowie 06.07.2015 в 14:10
  • Вид прокрутки остановил прокрутку –  Yaman 28.09.2016 в 13:44
4

Произошел один и тот же сценарий. 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 для просмотра прокрутки, пользовательского вида и кнопки.

    
ответ дан Siva 21.05.2013 в 12:11
3

Я думаю, вам нужно установить рамку кнопки. По умолчанию, если вы используете метод btn = [[UIButton alloc] init]; для инициализации, это будет UIButtonTypeCustom . Также установите для него цвет фона для цели отладки, чтобы отметить, где находится кнопка.  Теперь для вашего случая вам нужно установить рамку для этой кнопки, например, btn.frame = CGRectMake(0,0,100,100);

Для внутреннего UIScrollView реализуем этот метод делегата.

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
  {
       return ![view isKindOfClass:[UIButton class]];
  }

Это может сработать.

    
ответ дан IronMan 20.05.2013 в 15:06
  • Спасибо, я установил рамку кнопки, просто не сказал об этом в коде. –  George 20.05.2013 в 15:10
2

Кадр CustomView может влиять на ваш UIButton. Они перекрываются? Добавьте свою кнопку в CustomView только для проверки [CustomView addSubview:UIButton]; (используя ваши значения, конечно). Если это сработает, ваша проблема, скорее всего, будет перекрываться.

    
ответ дан sangony 20.05.2013 в 15:09
  • Спасибо за идею. Но когда я просто добавляю свой CustomView в ViewController, с вашим прокруткой, он отлично работает. Он останавливается, если он помещен в scrollview. –  George 20.05.2013 в 15:12
  • Если вы хотите просто добавить кнопку для просмотра таблицы, посмотрите этот предыдущий пост ... stackoverflow.com/questions/10229597/... –  sangony 20.05.2013 в 16:32
0

Ссылка из Capt.Hook помогла мне. Я использовал UIGestureRecognizer вместо UIButtons.

Разрешить UIScrollView и его подзаголовки как реагируют на прикосновение Используйте его, если у вас есть аналогичная проблема.

    
ответ дан George 21.05.2013 в 11:06
0

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

    
ответ дан Jeet 24.08.2017 в 18:24
0

Ни один из ответов не работал для меня, потому что моя проблема заключалась в том, что кнопка не была видна во время компоновки или что-то в этом роде.

FIX:

1) полностью переместите кнопку из scrollView (чтобы быть подчиненной главной переменной view ).

2) выберите button и элемент из вашего contentV , который вы хотите, чтобы ваша кнопка находилась (в моем случае: после последнего элемента в conventV)

3) добавьте необходимые ограничения (в моем случае: для выравнивания по нижнему краю)

4) Добавьте остальные ограничения для button .

5) Наслаждайтесь.

    
ответ дан Nikola Markovic 25.04.2018 в 19:29
-1

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

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

self.tableView.delaysContentTouches = NO
    
ответ дан Aks 23.08.2016 в 08:04
  • Это не работает для меня –  Joffrey Outtier 16.12.2016 в 15:36