帧更改时不重绘UIView背景颜色(动态扩展TableViewCell)

时间:2018-06-19 10:30:13

标签: ios uitableview uiview uiviewcontroller autolayout

我的自定义UITableViewCell背景为UIView,顶部有UITextView

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

当用户输入文字时,UITextView高度会正确展开。

UIView(在屏幕截图中突出显示)对所有4个边都有约束,与UITableViewCell一起成长。这工作正常(见屏幕截图,我也检查了帧高)。

问题是白色UIView.backgroundColor未展开,因此“展开”部分是透明的,让红色contentView.backgroundColor显示。

我试图在setNeedsLayout和/或UIViewUITableViewCell拨打UITextViewDelegate textViewDidChange,但这并没有解决问题。

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

这似乎与此SO post类似。

如何在整个更新的展开框架上绘制UIView backgroundColor,而不仅仅是原始框架?

Screenshot

更新2018-06-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]; 

1 个答案:

答案 0 :(得分:1)

如评论中所述,如果您的目标是iOS 11+,则可以使用CACornerMasklayer.maskedCorners),它允许您指定要四舍五入的特定角。

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