【问题标题】:UI Code in viewDidLayoutSubViews doesn't render correctly at runtimeviewDidLayoutSubViews 中的 UI 代码在运行时无法正确呈现
【发布时间】:2018-05-27 08:25:19
【问题描述】:

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

*edit,这是用于静态表格视图(我将其用作表单)。我知道在 .xib 中舍入单元格并重用单元格,但是我没有重用单元格,这种方法对我没有用。

我有一个带有静态表格视图的屏幕,它嵌入在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 设置边框层的宽度。

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

首先让我们看看从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 调用更优化)。

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

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

【问题讨论】:

  • 另外值得注意的是,当代码从viewDidLayoutSubViews 设置时,应用程序的性能会受到严重影响。
  • 为什么不在单元格的 layoutSubviews 方法中添加边框?
  • 为什么要在控制器的 viewDidAppear 中为单元格设置边框。您可以尝试为您的单元格创建自定义类并为您的单元格设置边框。
  • @NileshMahajan 这是一个静态表格视图,我没有重用单元格,我正在创建自定义单元格(我刷掉了单元格内容)。我已经为应用程序其他部分的动态表视图做了同样的事情,一切正常。
  • @trungduc 这是一个静态表格视图,所有单元格都通过 IB 连接起来,很遗憾我不能在这里使用任何表格视图方法

标签: objective-c uitableview viewdidappear viewdidlayoutsubviews


【解决方案1】:

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

我已经创建了一个demo项目,你可以查看TableViewCellBorder

【讨论】:

  • 是的,这将是处理动态表的好方法。事实上,我已经在我的应用程序的适当表格视图中舍入了一些单元格。不幸的是,因为我使用的是静态表格视图,所以我无法调用任何单元格方法。
  • 好吧,虽然我最初的问题还没有真正得到解答,但我打开了您的项目并查看了您如何将边框应用于单元格。我将您的代码重新编写到我的边框创建方法中,一切似乎都运行得更好。现在实际上可以在viewWillAppear 中触发代码,并且所有工作都按预期工作.. 奇怪!感谢演示
  • 太棒了:D。快乐的编码朋友!
  • 你应该在-layoutSubviews而不是-layoutIfNeeded中配置边框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2013-06-13
  • 2013-11-19
  • 2016-07-20
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多