действие пользователя в кнопках uiviews отключено после изменения размера кадра

У меня есть подкласс UIView, назовем его PopupView. внутри этого PopupView у меня есть NavigationBar с пользовательским uiview и uibutton (2) внутри него. Также есть UIButton (1) непосредственно внутри PopupView.

PopupView
  - UIButton (1)
  - UINavigationBar
    - UINavigationItem
      - UIBarButtonItem
        - UIView
          - UIButton (2)

причина этого безумия uibutton в uinavigationbar заключается в том, что я могу использовать наборы заглавных букв для фоновых изображений в uibutton, но не для элемента uibarbuttonitem.

Моя проблема:

я изменяю размер PopupView, используя анимацию uiview, и после завершения анимации я больше не могу нажимать кнопки в этом uiview.

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationCurveEaseOut animations:^{
        CGRect popupFrame = self.frame;
        popupFrame.size.height += 140.0f;
        popupFrame.origin.y = floorf(popupFrame.origin.y - (140.0f / 2));
        self.frame = popupFrame;
    } completion:^(BOOL finished) {
}];

это также происходит, если я не использую анимацию uiview и не устанавливаю новый кадр напрямую. также не имеет значения, изменяю ли я его размер одним щелчком мыши или непосредственно на viewDidLoad в его viewController.

Любые идеи, почему это происходит?


person choise    schedule 19.10.2012    source источник
comment
Запустите приложение и доведите его до состояния, когда кнопки не реагируют. Затем сделайте паузу в отладчике и выполните эту команду: po [[UIApp keyWindow] recursiveDescription]. Скопируйте вывод и вставьте в свой пост.   -  person rob mayoff    schedule 19.10.2012
comment
эй, Роб, см. gist.github.com/d9f7bb875be6590b315a. PopupView, о котором я говорю, называется MoviePopupView в GIST, внизу.   -  person choise    schedule 19.10.2012


Ответы (2)


Вот соответствующая часть вашего вывода recursiveDescription:

|    | <UIView: 0xaac0480; frame = (0 0; 320 568); tag = 23945; layer = <CALayer: 0xaac04e0>>
|    |    | <MJPopupBackgroundView: 0xaac0710; frame = (0 0; 320 568); tag = 23943; layer = <CALayer: 0xaac07c0>>
|    |    | <UIButton: 0xaac0aa0; frame = (0 0; 320 568); opaque = NO; layer = <CALayer: 0xaac0b60>>
|    |    | <UIView: 0x9d6fea0; frame = (10 204; 300 160); autoresize = W+H; tag = 23942; layer = <CALayer: 0x9d6ff50>>
|    |    |    | <MoviePopupView: 0xab1aaa0; frame = (0 -70; 300 300); clipsToBounds = YES; layer = <CALayer: 0xab1a070>>

Представление 0xaac закрывает экран.

Внутри представления 0xaac представление 0x9d6 имеет высоту 160 точек и центрировано по вертикали в представлении 0xaac.

Внутри представления 0x9d6 0xab1 MoviePopupView имеет высоту 300 точек и (с его началом Y -70) центрируется «внутри» представления 0x9d6, но выходит за верхний и нижний края представления 0x9d6.

Значение свойства clipsToBounds по умолчанию равно NO, поэтому представление 0x9d6 визуально не обрезает содержимое своего подпредставления 0xab1. Таким образом, кнопки все еще видны на экране.

Тем не менее, проверка на попадание всегда обрезает границы представления. Поэтому, когда вы пытаетесь коснуться одной из кнопок, попадание выходит за пределы представления 0x9d6 (высота которого составляет всего 160 точек). Представление 0x9d6 отклоняет касание до того, как оно доберется до MoviePopupView или кнопок под ним.

Это упоминается в hitTest:withEvent: документация:

Точки, лежащие за пределами приемника, никогда не считаются попаданиями, даже если они фактически находятся в пределах одного из подпредставлений приемника. Это может произойти, если для свойства clipsToBounds текущего представления установлено значение NO, а затронутое подпредставление выходит за пределы представления.

person rob mayoff    schedule 19.10.2012
comment
Успешно справился. Спасибо большое. нужно использовать recursiveDescription больше. хотел бы видеть инспектора, такого как инспектор webkit для симулятора :) - person choise; 19.10.2012
comment
милая !!! Застрял в похожей ситуации. Ширина и высота видов были установлены меньше, чем требуется, но вид был полностью виден. После установки clipsToBounds как YES я понял, что значения кадров были далеко. Спасибо ! - person GoodSp33d; 21.01.2015

Невозможно сказать наверняка, так как мы не видим расположение ваших кнопок, но если вы зададите цвет фона своему UIView, содержащему ваши кнопки (или установите его для обрезки подпредставлений), вы можете обнаружить, что изменение размера вызывает ваш кнопки должны находиться за пределами рамки, что делает их неактивными.

person Jeff Wolski    schedule 19.10.2012
comment
я их вижу, я просто не могу нажать на них - person choise; 19.10.2012
comment
а теперь я понимаю. кажется, что внутри представления, отсечение ничего не меняет, все еще на месте. - person choise; 19.10.2012
comment
Да, но если ваш вид не настроен на отсечение подвидов, вы сможете их увидеть, даже если они находятся за пределами кадра. - person Jeff Wolski; 19.10.2012