UI viewDidLayoutSubViews 中的代码在运行时无法正确呈现
UI Code in viewDidLayoutSubViews doesn't render correctly at runtime
我最近一直在与我的视图控制器作斗争,以便在 UIView
上设置正确的边框尺寸。
*edit,这是针对静态 table 视图的(我将其用作表单)。我知道 .xib 中的四舍五入单元格并重复使用该单元格但是我没有重复使用单元格,这种方法对我没有用。
我有一个带有静态 table 视图的屏幕,该视图嵌入 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];
}
注意 * 为了修复尺寸错误的单个单元格(总是 table 中的最后一个单元格)的一些错误,我正在根据 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
调用更优化)。
如您所见,单元格的角周围有一些非常明显的 'distortion'。提供的图片来自模拟器,但我已经在设备上尝试过并得到相同的结果(可能在我的 phone 上看起来更糟)。
我不知道为什么会这样,这意味着虽然我从 viewDidAppear
中获取了我的代码,但它和以前一样无法使用。我假设我可以在 viewDidLayoutSubViews
中调整一个渲染选项,但似乎找不到任何东西。非常感谢所有建议!
在我看来,您应该为 UITableViewCell
创建一个子类并在 layoutIfNeeded
方法中配置单元格边框。
我已经创建了一个演示项目,你可以查看它TableViewCellBorder。
我最近一直在与我的视图控制器作斗争,以便在 UIView
上设置正确的边框尺寸。
*edit,这是针对静态 table 视图的(我将其用作表单)。我知道 .xib 中的四舍五入单元格并重复使用该单元格但是我没有重复使用单元格,这种方法对我没有用。
我有一个带有静态 table 视图的屏幕,该视图嵌入 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];
}
注意 * 为了修复尺寸错误的单个单元格(总是 table 中的最后一个单元格)的一些错误,我正在根据 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
调用更优化)。
如您所见,单元格的角周围有一些非常明显的 'distortion'。提供的图片来自模拟器,但我已经在设备上尝试过并得到相同的结果(可能在我的 phone 上看起来更糟)。
我不知道为什么会这样,这意味着虽然我从 viewDidAppear
中获取了我的代码,但它和以前一样无法使用。我假设我可以在 viewDidLayoutSubViews
中调整一个渲染选项,但似乎找不到任何东西。非常感谢所有建议!
在我看来,您应该为 UITableViewCell
创建一个子类并在 layoutIfNeeded
方法中配置单元格边框。
我已经创建了一个演示项目,你可以查看它TableViewCellBorder。