簡體   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