1

Это так странно, что я создал новый проект, чтобы проверить, сошел ли я с ума.UITapGestureRecognizer не работает на первой вкладке

Вы можете увидеть проект здесь https://github.com/ojfoggin/TapTest

Я создал проект с UITabBarController в качестве начального вида.

Первая вкладка контроллера имеет два интерфейса UIimageView. Каждое изображение имеет на нем UItapGestureRecognizer с действием, которое просто регистрирует «Tap 1» или «Tap 2».

Если TabBarController не используется, все работает нормально. Однако, если используется TabBarController, работает только первый распознаватель аппликаций, второй - нет.

Однако, если вы переключаете t на другую вкладку, а затем обратно, то оба распознавателя работают?!?!?

Кроме того, я попытался добавить распознаватели жеста Тао в коде, и точно так же происходит.

Может ли кто-нибудь объяснить, почему это происходит и как его исправить?

+0

Ну, это работает, но только для 320 точек в ширину. Каким-то образом экран вращается, но не обработчики событий или что-то в этом роде. – Desdenova

+0

@ Desdenova это то, что я тоже видел. Довольно странно, видя, насколько базовым является приложение ... – rdurand

ответ

1

Я думаю, что это происходит из-за изменения ориентации вашего приложения. Если вы запустите приложение и нажмите на левую сторону (около первой трети изображения) второго UIImageView, он правильно зарегистрирует «Tap 2». Я думаю, что происходит то, что ваше приложение запускается в портрете, переключается на пейзаж и беспорядочно работает с вашим устройством распознавания жестов. Когда вы уйдете и вернитесь на вкладку, приложение уже находится в ландшафте, поэтому кадр обновлен правильно.

Решение: не один ключ. Я работаю только над портретами, поэтому я не знаю, что происходит с этой ориентацией. Это, как говорится, происхождение проблемы может быть не совсем то, что я сказал. Но я бы сказал, что это то, что нужно изучить.


Edit:

Я вошел в х положение крана жест в главном окне:

NSLog(@"%f", [((UITapGestureRecognizer*)sender) locationInView:self.view].x);

Максимальное х положение, в котором признается жест, кажется, ... 320, которые это ширина приложения для портрета. Это подтверждает мою идею ориентации делать что-то ваши взгляды ..


Edit 2: решение!

Я нашел эту тему: Landscape tab bar.

Проблема возникает с UITabBarController в ландшафтном режиме. Просто добавьте следующее в вашем viewDidLoad:

self.view.autoresizesSubviews = YES; 
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

Я проверил его, и теперь он работает отлично. Помните, что нажимайте Josh Adams 'ответ, поскольку он решает вашу проблему;]

+1

@Fogmeister: обновлено с помощью решения! – rdurand

+0

'po' на окне' recursiveDescription' показывает это довольно четко. Вопрос в том, почему ... – Sulthan

+0

@ Sulthan Я не понял, что вы говорите. – rdurand

1

@Desdenova: rdurand абсолютно прав. Я поместил несколько операторов журнала в представление, загрузив и увидим, и вот как это выглядит.

2014-02-14 09:04:19.167 TapTest[3395:60b] The frame is {{0, 0}, {320, 568}} 
2014-02-14 09:04:19.174 TapTest[3395:60b] The frame in viewwillappear is {{0, 0}, {320, 519}} 
2014-02-14 09:04:27.814 TapTest[3395:60b] The frame in viewwillappear is {{0, 0}, {568, 271}} 

Самый первый раз в viewDidload и viewwillappear, рамка 320568, но когда вы идете на второй взгляд и вернуться, рама установлена ​​правильно 568,271. Таким образом, решение будет установка кадра вправо, контролеры вид добавляются в tabbarcontroller

2

TL; DR

Откройте файл раскадровки в качестве исходного кода (XML) и заменить

<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 

с

<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES/> 

Для контроллера вида с изображениями.

Объяснение

проблема довольно легко найти с обычными инструментами отладки:

(lldb) po [[[[UIApplication sharedApplication] delegate] window] recursiveDescription] 

показывает

<UIWindow: 0x8c6a140; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c6a820>; layer = <UIWindowLayer: 0x8c66db0>> 
    | <UILayoutContainerView: 0x8c6a320; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x8c62350>> 
    | | <UITransitionView: 0x8c6a880; frame = (0 0; 480 320); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x8c50240>> 
    | | | <UIViewControllerWrapperView: 0x8c6cd70; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8c6c840>> 
    | | | | <UIView: 0x8c51070; frame = (0 0; 480 271); clipsToBounds = YES; autoresize = RM+BM; autoresizesSubviews = NO; layer = <CALayer: 0x8c51d80>> 
    | | | | | <UIImageView: 0x8c6bdc0; frame = (20 0; 219 160); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c65180>; layer = <CALayer: 0x8c4c930>> 
    | | | | | <UIImageView: 0x8c6a780; frame = (247 0; 219 160); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8c62a70>; layer = <CALayer: 0x8c6a9a0>> 
    | | | | | <_UILayoutGuide: 0x8c6c340; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x8c51110>> 
    | | | | | <_UILayoutGuide: 0x8c6c760; frame = (0 271; 0 0); hidden = YES; layer = <CALayer: 0x8c6c7d0>> 
    | | <UITabBar: 0x8c64180; frame = (0 271; 480 49); autoresize = W+TM; layer = <CALayer: 0x8c642a0>> 
    | | | <_UITabBarBackgroundView: 0x8a48e50; frame = (0 0; 480 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x8a48f40>> 
    | | | <UITabBarButton: 0x8c64980; frame = (2 1; 236 48); opaque = NO; layer = <CALayer: 0x8c684c0>> 
    | | | | <UITabBarButtonLabel: 0x8c64dd0; frame = (108 35; 21 12); text = 'Item'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8c64ef0>> 
    | | | <UITabBarButton: 0x8c69d90; frame = (242 1; 236 48); opaque = NO; layer = <CALayer: 0x8c6a250>> 
    | | | | <UITabBarButtonLabel: 0x8c69e70; frame = (108 35; 21 12); text = 'Item'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8c68c20>> 
    | | | <UIImageView: 0x8a49240; frame = (0 -0.5; 480 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x8a492d0>> 

где важная часть:

<UILayoutContainerView: 0x8c6a320; frame = (0 0; 320 480); autoresize = W+H; 
    | | <UITransitionView: 0x8c6a880; frame = (0 0; 480 320);autoresize = W+H 
    | | | <UIViewControllerWrapperView: 0x8c6cd70; frame = (0 0; 320 480); autoresize = RM+BM; 
    | | | | <UIView: 0x8c51070; frame = (0 0; 480 271); autoresize = RM+BM 

Обратите внимание, что UIViewControllerWrapperView имеет плохие размеры, потому что его авторезистирующая маска не является W+H, но RM+BM. Однако основной причиной является маска авторезистирования UIView, так как UIViewControllerWrapperView генерируется динамически, а маска только копируется.

Если проверить исходный код видеоредактора, вы увидите строку:

<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 

Для представления в первом контроллере представления. Замена его

<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 

будет решить эту проблему.

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