Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对于直接从Xib加载的UIView,何时应用UIView大小类?_Ios_Objective C_Uiview_Xib_Size Classes - Fatal编程技术网

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

Ios 对于直接从Xib加载的UIView,何时应用UIView大小类?,ios,objective-c,uiview,xib,size-classes,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初始化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并在那里设置值,但没有成功。由于其他组件正确显示在屏幕上,因此尺寸类约束似乎在LayoutSubView之后应用,而无需再次调用LayoutSubView


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

如果我把它放在init函数的末尾,它就会起作用:

 [self performSelector:@selector(updateButtonBackground) withObject:nil afterDelay:.001];
显然,到目前为止,已使用大小类设置了约束。但这肯定不是理想的,所以如果有人的答案是事件驱动的,或者涉及到视图生命周期,就适用于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..
}

您需要在ViewDidLayoutSubView中应用角半径。正是在这一点上,您知道按钮的边界已经建立


您可以看到一个示例。

我知道这个线程很旧,但我在这里看不到好的答案

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

似乎在调用Xib加载函数时,会立即调用awakeFromNib,因此即使在if self init主体之前也会调用;它仍然基于任意、任意屏幕大小设置角半径…这是针对从xib以编程方式初始化的视图,并且将其放在viewDidLayoutSubviews中似乎不起作用…您提到您正在为任意宽度、任意高度和任意宽度、紧凑高度执行大小类。这意味着,只有当iPhone处于横向模式时,你才能看到它与Any/Any的区别。您是否在iPhone上以纵向方式启动,然后旋转到横向和viewDidLayoutSubviews在这种情况下不起作用?没有旋转,问题似乎是视图设置为任何大小,甚至在viewDidLayoutSubviews中/之后。。。闻起来像虫子!除非根据您的大小类别将其旋转到横向或在横向中启动,否则在viewDidLayoutSubviews之后它仍然是任意对任意。很有意思的是,看看紧凑宽度/任何高度的尺寸等级会发生什么,这样它的纵向尺寸就应该是正确的。