何时应用UIView大小类,对于直接从Xib加载的UIView?

时间:2015-07-08 16:30:09

标签: ios objective-c uiview xib size-classes

我以编程方式使用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;

如果我在使用任意宽度,紧凑高度的设备上尝试在初始化功能中设置按钮的半径,则标签的框架仍设置为任意宽度,任何高度值。我也尝试重写layoutSubviews并在那里设置值,没有运气。似乎在layoutSubviews之后应用了size类约束而没有另外调用layoutSubviews,因为其他组件在屏幕上正确显示。

所以,我想知道是否有一个很好的切入点可以让我抓住应用大小等级的位置,这样我就可以正确设置按钮的背景角半径。我可以通过编程方式设置按钮,但是我想知道如何执行此操作,因为它可能会在转换为大小类的过程中再次出现。

5 个答案:

答案 0 :(得分:0)

在您的xib类-(void)awakeFromNib;

答案 1 :(得分:0)

如果我把它放在init函数的末尾,这是有效的:

 [self performSelector:@selector(updateButtonBackground) withObject:nil afterDelay:.001];

显然,在这一点上,已经使用大小类设置了约束。虽然它当然不是理想的,所以如果有人得到的回答是事件驱动的,或者涉及到视图"生命周期" (只要适用于UIView)我接受......

答案 2 :(得分:0)

这样做怎么样?

-(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..
}

答案 3 :(得分:0)

我知道这个帖子已经老了,但我在这里看不到好的答案。

大小类在traitCollectionDidChange:方法中定义。您无法确保在initWithFrame:awakeFromNib:中设置了traitCollection。 因此,请根据视图大小类在traitCollectionDidChange:方法中设置角半径。

答案 4 :(得分:-1)

您需要在viewDidLayoutSubviews中应用转角半径。在这一点上,你知道按钮的界限已经建立。

您可以看到示例on my blog