我们只能在ViewDidappear中正确配置UI吗?而不是在ViewWillAppear/ViewDidload中



i具有带有圆形边框的单元格的静态表视图。我已经注意到,在对不同的模拟器进行测试时,尽管我的自动布局约束起作用,但边界并不总是正确的宽度。此特定屏幕由包含嵌入式tableViewController

UIView的视图控制器组成

我已经进行了一些调查,发现边界的宽度实际上取决于故事板手机的宽度。这意味着,如果我有一个iPhone 8的故事板,那么8 的单元格会太短,反之亦然,一个8 的故事板会导致细胞太长(并扩展了屏幕)。

目前,我正在设置ViewDidload中的单元边界,这是我用来配置单元格的代码:

- (void)configureCellThree {
    //Add Border
    CALayer *borderLayer = [CALayer layer];
    CGRect borderFrame = CGRectMake(0, 0, (_contentCellThree.frame.size.width), (_contentCellThree.frame.size.height));
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]];
    [borderLayer setFrame:borderFrame];
    [borderLayer setCornerRadius:_contentCellThree.frame.size.height / 2];
    [borderLayer setBorderWidth:1.0];
    [borderLayer setBorderColor:[kTextColor2 CGColor]];
    // [borderLayer setOpacity:0.5];
    [_contentCellThree.layer addSublayer:borderLayer];
}

现在,如果我在viewDidAppear中运行此代码,则一切都可以在两个设备上使用。我在我的主视图控制器中添加了一些日志,以了解如何设置事物。

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"VDL - SELF.VIEW = %@", self.view);
    NSLog(@"VDL - CONTAINER VIEW = %@", self.profileScrollingContainerView);
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"VDA- SELF.VIEW = %@", self.view);
    NSLog(@"VDA - CONTAINER VIEW = %@", self.profileScrollingContainerView);
}

我怀疑ViewDidload使用了来自情节提要的大小信息,而不是视图本身(看起来不正确)。此记录证实了这一点。如果我查看负责显示我的tableview的UIView,当故事板设置为8 时,它具有以下帧属性:X = 0, Y = 349, W = 414, H = 338。现在让我们查看记录的结果:

VDL - SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 0; 375 667); 
VDL - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 349; 414 338); 

VDA- SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 64; 375 603); 
VDA - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 285; 375 269);

因此,当视图加载时,表观视图获取了有关视图大小的错误信息。当viewDidAppear被调用时,它具有正确的视图尺寸,并且可以正常工作。我的问题是我不想在我的ViewDidAppear中调用初始代码。

我在这里读到,我应该将我的UI几何代码放入viewWillAppear中,但是我尝试了一下,并且遇到了同样的问题。

VWA - CONTAINER VIEW = <UIView: 0x7fec04d97700; frame = (0 349; 414 338);

因此,要合并我的问题,如何在加载/出现视图之前获取视图的属性,以便我可以正确设置UI?

我已经读到我需要子类UIView并可能使用setFrame,但是我真的不知道我是怎么做的。

子类UITableViewCell并实现layoutSubviews,即参见文档:

"子类可以根据需要覆盖此方法,以执行其子视图的更精确的布局。仅当子视图的自动化和基于约束的行为不提供您想要的行为时,才应覆盖此方法。您可以。使用您的实现直接设置子视图的框架矩形。"

,所以事实证明我正在使用错误的方法来执行此操作。我发现这个问题解决了我的整个问题。基本上,如果您需要执行UI计算(例如添加自定义视图),则应在-(void)viewDidLayoutSubviews中执行它们。此方法在视图制定了所有尺寸和约束之后调用此方法,因此您在此处所做的任何操作都将使用视图的正确属性执行!

最新更新