1

我一直在使用autolayout幾個星期了。 目前,我正在使用名爲FLKAutoLayout的第三方庫,這使得該過程變得更加簡單。 我現在可以按照我想要的方式構建視圖,通常沒有問題。 但是,在過去的四天裏,一旦涉及視圖控制器,我一直在努力解決自動佈局問題。 我很好,各種各樣的UIViews ...但由於某種原因,每個viewcontroller.view是一個完整的惡魔。 我什麼也得不到,但得到一個viewcontroller.view的大小,我想要的方式和一個更深層次的問題是兒童viewcontrollers的UIViews使用autolayout時沒有正確接收事件的問題。 手動指定幀時,子視圖控制器可以很好地工作,但所有內容都會通過自動佈局進行分解。iOS:Autolayout與子視圖控制器

我不明白viewcontroller的UIView有什麼不同,使它不同於所有其他人......我的思想在挫敗中融化。 ios是否在幕後或我的視圖控制器視圖中混淆了?

sample image http://i39.tinypic.com/6qeh3r.png

在圖像中,紅色區域屬於子視圖控制器。這個區域不應該超過最底層的子視圖(表示三個的卡片)。這應該很容易,我可以得到它與一堆正常的UIViews工作得很好,但因爲這是一個viewcontroller,一切都打破...

任何人都可以闡明什麼是我不知道。潛在問題的任何線索都非常感謝。

感謝您的閱讀。

更新:該問題可能與曖昧的限制

UIView *box = [[UIView alloc]init]; 
[box addSubview:imageView]; 
[box addSubview:nameLabel]; 

imageView constrainWidth:@"32" height:@"32"]; 
[imageView alignTop:@">=0" leading:@"0" bottom:@"<=0" trailing:@"<=0" toView:box]; 
[imageView alignCenterYWithView:box predicate:@"0"]; 

[nameLabel constrainLeadingSpaceToView:imageView predicate:@"5"]; 
[nameLabel alignTop:@">=0" leading:@">=0" bottom:@"<=0" trailing:@"<=0" toView:box]; 
[nameLabel alignCenterYWithView:box predicate:@"0"]; 

[self addSubview:box]; 
[box alignTop:@"5" leading:@"5" bottom:@"-5" trailing:@"-5" toView:self]; 

上面的例子是一個模糊的佈局,但我想不出有什麼地方錯了...

+0

您應該在添加子視圖控制器的位置顯示代碼,以及您嘗試添加的約束條件。 – rdelmar

+0

這是否在滾動視圖中? – Maarten

+0

目前沒有滾動視圖。但是,在過去,當我嘗試在自動佈局中使用滾動視圖時,所有視圖都變得非常緊湊。但是,這是未來的另一個問題。 – Sethypie

回答

5

這應該可能是一個評論,但評論吸引代碼。 ;-)


您是否檢查了模糊約束?對我來說,這種看法看起來可能是由模糊的約束引起的。

將此代碼添加到您的應用程序委託:

// before @implementation AppDelegate 
@interface UIWindow (AutoLayoutDebug) 
+ (UIWindow *)keyWindow; 
- (NSString *)_autolayoutTrace; 
@end 

// inside of @implementation 

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    NSString *autolayoutTrace = [[UIWindow keyWindow] _autolayoutTrace]; 
    if ([autolayoutTrace rangeOfString:@"AMBIGUOUS"].location != NSNotFound) { 
     NSLog(@"%@", autolayoutTrace); 
    } 
    else { 
     NSLog(@"No Ambiguous autolayout found"); 
    } 
} 

,現在動搖你的模擬器。您會在硬件菜單中找到搖動手勢。

如果它未顯示「No Ambiguous autolayout found」,則檢查打印的跡線中的模糊ui元素。他們被標記爲「AMBIGUOUS」。

然後開始添加約束,這樣就不會再含糊不清了。

您可以在UI元素上調用exerciseAmbiguityInLayout,該元素具有不明確的佈局以獲取缺少約束的提示。


並確保刪除您的發貨產品中的調試代碼。你可能把這兩部分的#if DEBUG#endif

+0

感謝Matthias!我發現了一些模棱兩可的佈局......這有點糟糕,但至少我知道現在要看什麼。我對如何識別哪些視圖具有不明確的佈局以及約束條件如何模糊不清有點不確定。你提到使用exerciseAmbiguityInLayout,但我沒有看到信息的顯示位置......反正在調試窗口中什麼也沒有顯示。我已經在多個UIViews上使用了這種方法,這些UIViews有不明確的約束,但似乎沒有發生任何事情。 – Sethypie

+0

Upvoted爲漂亮的搖動調試技巧。 –

1

內部在你的代碼,你需要在子視圖控制器添加到視圖控制器層次結構中的某一點:[topViewController addChildViewController:childViewController];。之後不要忘記添加-didMoveToParentViewController:

這將確保您的旋轉和觸摸事件以您期望的方式轉發。

至於你的自動佈局問題:Erica Sadun寫了一些very useful autolayout debugging tools。我主要用它來查看她在UIView的一個類別中編寫的viewLayoutDescription,它打印出一個非常可讀的約束列表,告訴你模糊性等。試試看,它真的幫助我弄清楚我的約束是如何弄亂。

第二:始終確保您的所有視圖都有translateAutoresizingMasksIntoConstraints設置爲NO

相關問題