[英]When are UIView size classes applied, for a UIView loaded directly from a Xib?
我正在以編程方式初始化帶有xib的UIView:
- (id)initWithFrame:(CGRect)frame
{
self = [[[NSBundle mainBundle] loadNibNamed:@"MyViewNib" owner:self options:nil] objectAtIndex:0];
if (self)
{
//perform setup of various components
return self;
}
}
此視圖將尺寸類用於“任意寬度”,“任何高度”和“任意寬度”,“緊湊高度”。
我在xib中有一個UIButton,需要在其背景中放一個圓圈,如下所示:
self.closeButton.layer.cornerRadius = self.closeButton.frame.size.width / 2.0f;
self.closeButton.layer.backgroundColor = [UIColor colorWithWhite:164.0f / 255.0f alpha:1.0f].CGColor;
如果我在使用“任意寬度,緊湊高度”的設備上嘗試在init函數中設置按鈕的拐角半徑,則標簽的框架仍設置為“任意寬度,任意高度”值。 我也嘗試覆蓋layoutSubviews並在那里設置值,但是沒有運氣。 似乎在classLayoutSubviews之后應用了大小類約束,而無需再次調用layoutSubviews,因為其他組件可以正確顯示在屏幕上。
因此,我想知道是否有一個很好的入口點可以讓我了解應用大小類的位置,以便可以正確設置按鈕的背景角半徑。 我可以通過編程方式設置按鈕,但是我想弄清楚如何執行此操作,因為在轉換為尺寸類的過程中它可能會再次出現。
在您的xib類中-(void)awakeFromNib;
如果我將它放在init函數的末尾,這將起作用:
[self performSelector:@selector(updateButtonBackground) withObject:nil afterDelay:.001];
顯然,到此為止,已經使用size類設置了約束。 但是,這肯定不是理想的,因此,如果有人得到事件驅動的答案或涉及視圖“生命周期”(就適用於UIView的觀點),我將接受...
怎么樣呢?
-(void)layoutSubviews
{
[super layoutSubviews];
self.closeButton.layer.cornerRadius = self.closeButton.frame.size.width / 2.0f;
self.closeButton.layer.backgroundColor = [UIColor colorWithWhite:164.0f / 255.0f alpha:1.0f].CGColor;
//more of your changes
[self layoutIfNeeded]; // You can remove this line if it works without it for you..
}
我知道這個線程很舊,但是我在這里看不到任何好的答案。
大小類在traitCollectionDidChange:方法中定義。 您不能確保在initWithFrame:
或awakeFromNib:
設置traitCollection。 因此,根據視圖大小類在traitCollectionDidChange:
方法中設置拐角半徑。
您需要在viewDidLayoutSubviews
應用拐角半徑。 至此,您知道按鈕的邊界已建立。
您可以在我的博客上看到一個示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.