1

這太奇怪了,我創建了一個新項目來測試我是否瘋了。UITapGestureRecognizer不能在第一個標籤中工作

這裏你可以看到該項目https://github.com/ojfoggin/TapTest

我已經創建了一個帶有UITabBarController作爲初始視圖的項目。

第一個控制器選項卡有兩個UIimageViews。每個圖像視圖上都有一個UItapGestureRecognizer,只需記錄「Tap 1」或「Tap 2」即可。

如果沒有使用TabBarController,那麼一切工作正常。但是,如果使用TabBarController,那麼只有第一個抽頭識別器起作用,第二個則不起作用。

但是,如果您切換到不同的選項卡然後再返回,那麼這兩個識別器都可以工作?!?!?

此外,我已經嘗試在代碼中添加道具手勢識別器,並且發生完全相同的事情。

任何人都可以解釋爲什麼發生這種情況,以及如何解決它?

+0

嗯,它的工作,但只有320點寬。不知何故,屏幕旋轉,但不是事件處理程序或什麼。 – Desdenova

+0

@Desdenova這就是我所看到的。很奇怪,看到這個應用程序有多基礎... – rdurand

回答

1

我認爲這來自您的應用程序更改方向。如果啓動應用程序並點擊第二個UIImageView的左側(大約前三分之一圖像),它會正確記錄「Tap 2」。我認爲會發生什麼情況是,您的應用程序以縱向方式啓動,切換到橫向,並混淆了您的手勢識別器的操作框架。當您離開並返回到選項卡時,該應用程序已處於橫向模式,因此該框架已正確更新。

解決方案:沒有一個線索。我只在肖像應用上工作,所以我不知道這個方向會發生什麼。話雖如此,問題的根源可能並不完全如我所說。但我會說這是需要研究的東西。


編輯:

我記錄在主視圖中的敲擊手勢x位置:

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

最大X位置,其中手勢被識別似乎是... 320,其是一個肖像應用程序的寬度。這似乎證實了我的方向做一些你的意見的想法..


編輯2:解決方案!

我發現此線程:Landscape tab bar

問題出現在橫向模式下UITabBarController。只需添加下面你viewDidLoad

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

我測試,它現在能正常工作。請記住撥打Josh Adams'答案,因爲它可以解決您的問題;]

+1

@Fogmeister:更新解決方案! – rdurand

+0

在窗口'recursiveDescription'上的'po'顯示得很清楚。問題是爲什麼... – 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,但是當你去到第二視圖和回來,框架設置正確568271。因此該解決方案將被設置權限,而視圖控制器被添加到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"/> 

將解決此問題。

相關問題