[英]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.