viewDidLayoutSubViews中的UI代码无法在运行时正确呈现

时间:2017-12-13 12:34:07

标签: objective-c uitableview viewdidappear viewdidlayoutsubviews

我最近一直在与我的视图控制器进行斗争,以便在UIView上设置边框的正确尺寸。

*编辑,这是针对静态tableview(我将其用作表单)。我知道在.xib中舍入细胞并重复使用细胞,但是我没有重复使用细胞,这种方法对我没用。

我有一个带有静态tableview的屏幕,该屏幕嵌入UIView并显示在主View Controller上。我一直遇到边框问题,好像我在viewDidAppear之前将它设置在任何地方我添加边框的方法将使用错误的尺寸并错误地显示边框。这是我用来为我的UIView添加边框的方法:

- (void)createCellBorder: (UIView *)view container:(UIView *)container {
    CALayer *borderLayer = [CALayer layer];

    CGRect adjustedContainer = CGRectMake(0, 0, container.frame.size.width - 20, container.frame.size.height);

    CGRect borderFrame = CGRectMake(0, 0, (adjustedContainer.size.width), (view.frame.size.height));
    NSLog(@"VIEW DIMENSIONS FOR %@ %f, %f",view , view.frame.size.width, view.frame.size.height);
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]];
    [borderLayer setFrame:borderFrame];
    [borderLayer setCornerRadius:view.frame.size.height / 2];
    [borderLayer setBorderWidth:1.0];
    [borderLayer setBorderColor:[kTextColor2 CGColor]];
    [view.layer addSublayer:borderLayer];
}

注意*要修复一些具有错误尺寸的单个单元格的错误(始终是表格中的最后一个单元格),我将根据其中包含的UITableView来设置边框图层的宽度。

无论如何,我最终发现不是使用viewDidAppear我应该使用viewDidLayoutSubviews设置我的UI几何图形,因为此时视图已计算其尺寸。这是一种享受,我的单元格将显示圆角边框...但渲染本身存在问题。

首先让我们看一下viewDidAppear正在舍入的单元格。cells rounded in the viewDidAppear

一切看起来都很好,这正是我希望我的细胞看起来的样子(我已经删除了它们的内容以仅展示边框)。让我们看一下我用来围绕单元格的代码。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self configureCells];

}

- (void)configureCells {
    [self createCellBorder:_contentCellOne container:_profileTable];
    [self createCellBorder:_contentCellTwo container:_profileTable];
    [self createCellBorder:_contentCellThree container:_profileTable];
    [self createCellBorder:_contentCellFour container:_profileTable];
    [self createCellBorder:_contentCellFive container:_profileTable];
    [self createCellBorder:_contentCellSix container:_profileTable];
    [self createCellBorder:_contentCellSeven container:_profileTable];
}

现在让我们改变我呼叫configureCells的地方,看看差异。

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [self configureCells];

}

所有改变的地方都是我称之为的方法。从理论上讲,这应该是配置我的UI的正确位置(当然比从viewDidAppear调用更合理。)

cells rounded in viewDidLayoutSubViews

正如您所看到的,细胞角落周围有一些非常明显的“扭曲”。提供的图片来自模拟器,但我在设备上试过这个并获得相同的结果(可能在我的手机上看起来更糟)。

我不知道为什么会发生这种情况,这意味着虽然我已经从viewDidAppear中获取了代码,但它仍然像以前一样无法使用。我假设我会在viewDidLayoutSubViews中调整一个渲染选项,但似乎找不到任何东西。所有建议都非常感谢!

1 个答案:

答案 0 :(得分:1)

在我看来,您应该为UITableViewCell创建一个子类,并在layoutIfNeeded方法中配置单元格边框。

我创建了一个演示项目,您可以查看TableViewCellBorder