2016-06-19 260 views
1

我爲用戶輸入製作了一個很酷的自定義數字鍵盤。它由4個組成,它們本身嵌套在父母UIStackView內。我想讓按鈕變圓。所需的外觀是這樣的:UIStackView中出現意外的圓角UIButton行爲

enter image description here

這裏是圓邊角代碼:

for (UIStackView *subStack in self.mainStackView.arrangedSubviews) 
{ 
    for (UIButton *button in subStack.arrangedSubviews) 
    { 
     button.layer.borderWidth = 1.0f; 
     button.layer.borderColor = [[UIColor orangeColor] CGColor]; 
     button.layer.cornerRadius = (button.frame.size.width)/2.0f; 
     button.layer.masksToBounds = YES; 
     button.clipsToBounds = YES; 
     [button setShowsTouchWhenHighlighted:YES]; 
     NSLog(@"button.tag = %ld", (long)button.tag); 
    } 
} 
[self.view setNeedsLayout]; 

的問題是,當我把這個代碼放到viewDidLoadviewWillAppear,按鈕如下圖所示:

enter image description here

完全圓潤的按鈕不出現,除非我把代碼放在viewDidAppear。但是在呈現圓之前有一個明顯的延遲。

任何人都有一個想法是什麼導致了奇怪的行爲?我想知道它是否與UIStackViews本身有關,因爲我遇到了其他問題。

使用的Xcode 7.3.1和埃爾卡皮坦10.11.3

編輯

我想在下面@Murat Tezyapar的答案的建議,但代碼不會被調用在viewDidLayoutSubviews,也不在viewWillLayoutSubviews(我認爲這值得一試......)。我做了一些NSLogging,並發現只有代碼在viewDidAppear中執行時,按鈕才能達到其合適的大小(70點)。如上所述,這些圈子仍然在按鈕本身和其他所有內容之後呈現。

回答

2

當viewWillAppear和viewDidLoad被觸發時,可能會發生這種情況,因爲您的視圖的框架尚未設置。 viewDidLayoutSubviews是一個很好的地方,因爲所有的約束都被考慮在內,並且視圖根據你的約束來調整。看起來你試圖在viewDidLoad上訪問你的按鈕框架,並且當它在viewDidLayoutSubviews中應該是50px時,獲得它們的初始值(例如:20px寬度和高度)。

所以,當你設置你的角落半徑有:

button.layer.cornerRadius = (button.frame.size.width)/2.0f; 

你不能得到正確的幀的寬度,所以,你可以在一個50像素寬按鈕10.0圓角半徑。

結論:

使用viewDidLayoutSubviews如果你使用的自動佈局。

+0

謝謝。請參閱上面的編輯... – rattletrap99

+0

我在堆棧視圖內循環查看視圖,並且在視圖中使用圓化代碼將僅出現圓角,而不是完美的圓圈。當我將viewWillAppear的環化代碼移到viewDidLayoutSubviews時,問題就解決了。感謝您的建議! –