繁体   English   中英

当UIView的尺寸类应用,对于一个UIView直接从XIB装入?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM