如何在旋转时处理 UIView 圆角(使用 CAShapeLayer)

Posted

技术标签:

【中文标题】如何在旋转时处理 UIView 圆角(使用 CAShapeLayer)【英文标题】:How to handle UIView rounded corners (using CAShapeLayer) on rotation 【发布时间】:2014-04-27 16:39:07 【问题描述】:

我有一个包含 UIView 的 UITableViewCell。当单元格是该部分中的唯一行(即在我的实现中未选择)时,我想将 UIView 的所有角都弄圆。如果选择了单元格,那么我只想围绕 UIView 的顶部两个角。我正在尝试在自定义 tableviewcell 的 layoutSubviews 中执行此操作。

- (void)layoutSubviews

    [super layoutSubviews];

    self.roundedView.layer.mask = nil;

    if (self.sectionSelected) 
        self.maskLayer = [CAShapeLayer layer];
        self.maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.roundedView.bounds byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(10, 10)].CGPath;
        self.roundedView.layer.mask = self.maskLayer;
     else 
        self.maskLayer = [CAShapeLayer layer];
        self.maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.roundedView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(10, 10)].CGPath;
        self.roundedView.layer.mask = self.maskLayer;
    

不幸的是,这种方法并非一直有效。如果我有一个纵向选择的单元格(self.sectionSelected = YES)。然后取消选择(self.sectionSelected = NO)。然后旋转到横向并再次选择单元格。它显示的单元格大小应该是纵向的。所以我相信它仍然在应用纵向图层蒙版,而不是风景图层。如果我将它滚动到视图之外,然后再将其返回,它会更新到适当的宽度。另外值得注意的是,我调用 [self.tableView reloadData];在 didRotateFromInterfaceOrientation 中。

有什么办法可以避免这个问题吗?提前致谢

【问题讨论】:

深入挖掘。似乎 roundedView.bounds 最初返回的是纵向视图的大小,而不是横向。为什么会发生这种情况? 如果您使用 tableView 自己的选择逻辑,可能值得尝试在 setSelected:animated: 中执行此操作 【参考方案1】:

只需添加“self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth;”即可解决

【讨论】:

以上是关于如何在旋转时处理 UIView 圆角(使用 CAShapeLayer)的主要内容,如果未能解决你的问题,请参考以下文章

顺序 UIView 转换

使用触摸平滑旋转 UIView

如何以编程方式在 UIview 中制作圆角和边?

如何旋转 UIView?

旋转放置和移动视图 (UIView)

如何制作具有圆角顶角和方形底角的 UIView