【问题标题】:UIView background color not redrawn when frame changes (in dynamically expanding TableViewCell)框架更改时不重绘 UIView 背景颜色(在动态扩展的 TableViewCell 中)
【发布时间】:2018-11-28 06:55:04
【问题描述】:

我有一个自定义UITableViewCell,背景是UIView,顶部是UITextView

UIView 用于将背景颜色设置为白色,圆角边缘显示单元格的contentView.backgroundColor(红色)在角落。

当用户输入文本时,UITextView 高度正确扩展。

UIView(在屏幕截图中突出显示)在所有 4 个方面都有约束,以便与 UITableViewCell 一起增长。这可以正常工作(见截图,我还检查了框架高度)。

问题是白色的UIView.backgroundColor没有展开,所以“展开”的部分是透明的,让红色的contentView.backgroundColor显示出来。

我尝试在UIView 和/或UITextViewDelegate textViewDidChange 中的UITableViewCell 上调用setNeedsLayout,但这并没有解决问题。

另外,在tableView:cellForRowAtIndexPath:tableView:willDisplayCell:forRowAtIndexPath 中设置背景颜色并没有什么区别。

这似乎和这个SO post类似。

我怎样才能让UIView backgroundColor 绘制在整个更新、扩展的框架上,而不仅仅是原始框架?

2018 年 6 月 20 日更新:

这是我为获得圆角所做的工作(来自this SO post

// from http://stackoverflow.com/questions/4847163/round-two-corners-in-uiview/14485362
- (void)setMaskTo:(id)sender byRoundingCorners:(UIRectCorner)corners withCornerRadii:(CGSize)radii {
    // UIButton requires this
    [sender layer].cornerRadius = 0.0;

    UIBezierPath *shapePath = [UIBezierPath bezierPathWithRoundedRect:[sender bounds]
                                                    byRoundingCorners:corners
                                                          cornerRadii:radii];

    CAShapeLayer *newCornerLayer = [CAShapeLayer layer];
    newCornerLayer.frame = [sender bounds];
    newCornerLayer.path = shapePath.CGPath;
    [sender layer].mask = newCornerLayer;
}   

然后,我在tableView:cellForRowAtIndexPath: 中调用它

[self setMaskTo:textInputCell.bgColorView byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) withCornerRadii:CORNER_RADII]; 

【问题讨论】:

  • 您需要在更改框架的同时动态更改约束。
  • 您能进一步解释一下吗?目前,我没有在代码中明确更改框架。
  • @thomers - 你是如何“圆角”你的白色 UIView 的?你在设置它的layer.cornerRadius吗?还是你在设置图层路径?
  • @DonMag 我正在设置图层路径 - 请参阅我的更新。我是否正确假设问题是我只设置了一次路径,而不是更新它?如果是这样,我应该在哪里/如何更新它?或者摆脱 UIBezierPath 并完全做其他事情? (请注意,我想定义要舍入的特定角)
  • (重新访问关于圆角特定角的引用 SO 答案,我发现我可以使用 iOS 11 的 CACornerMask 而不是设置 bezierPathWithRoundedRect)

标签: ios uitableview uiview uiviewcontroller autolayout


【解决方案1】:

如 cmets 中所述,如果您的目标是 iOS 11+,则可以使用 CACornerMask (layer.maskedCorners),它允许您指定要圆角的特定角。

如果您需要支持 iOS 10 或更早版本,可以将 UIBezierPath 代码放入 layoutSubviews() - 这样,您可以在视图的框架发生变化时随时更新其框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多