cornerRadius 在 Swift 2.3 / iOS 10 / Xcode 8 时停止工作

cornerRadius stopped working in Swift 2.3 / iOS 10 / Xcode 8

我在 UIView 上设置了一个 cornerRadius,在同一个 UIView 中设置了一个 UIImageView。我正在用 RockProfileView.frame.size.height / 2 计算角半径,但 UIView 在 iOS 10 中停止显示。

进一步检查后,我发现 RockProfileView.frame.size.height / 2 的值是 1000.0,而宽度和高度约束设置为 64.0

当我将 RockProfileView.layer.cornerRadius = 32 硬编码为 64/2 时,它工作得很好。

可能是什么问题?

完整代码:

    RockProfileView.layer.cornerRadius = RockProfileView.frame.size.height / 2
    RockProfileView.clipsToBounds = true
    RockProgressView.layer.masksToBounds = true

正如 Rob 的回答,我已将代码从 viewDidLoad 移至 viewDidAppear,问题已解决。

或 在 viewDidLoad 中的代码之前添加 self.view.layoutIfNeeded() 也可以解决问题。

对于 UITableViewCell,在 awakeFromNib 内部添加 [self layoutIfNeeded]; 之前更新角半径应该可以解决所有问题。

我在 awakeFromNib 中完成了这段代码,但在升级到 ios 10+xcode 8 后,它停止工作了。

然后我将此代码移至 layoutSubViews 方法。然后就成功了。

希望这对你有用。

如果你仍然想在 awakefromnib 中执行此操作,请在延迟一段时间后执行此操作(通过使用 dispatch_after 或 NSOperatinQueue 或 performSelectorWithDelay)

如果它在您的 ViewControllers 之一中,而不是将所有层操作移动到 viewDidLayer,而是将该代码移动到 DispatchQueue 中。这对我有用:

DispatchQueue.main.async {
            let layer = self.signUpBtn.layer
            layer.borderColor = UIColor.white.cgColor
            layer.borderWidth = 2 / UIScreen.main.scale
        }

希望对您有所帮助

我有同样的问题,iOS 只有 10 个。我发现 ViewDidLayoutSubviews 或 ViewDidLoad(也可能是其他但我没有检查)只有在我按照 YPK 的建议将布局代码包装在调度队列中时才有效。

我使用的是 Xamarin,所以语法有点不同:

DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            SetYourViewProperties();
        });

对我来说,它起作用的是先调用 layoutIfNeeded,然后再调用 set cornerRadius

在 WWDC 2016 | What's New in Auto Layout, Apple 推荐一种名为

的自动布局方式

Incrementally Adopting Autolayout

这意味着如果布局简单,您可以使用自动调整大小。它将在 运行 时间转化为约束条件。

所以解决方案之一是使用自动调整大小,您可以随时获得关于视图的正确框架。但前提是autoresizing能满足你的layout

我必须 运行 它在主线程上才能工作。

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});

新增一件事XCode8我们不能直接设置图层的cornerRadius

当你想应用UIView的cornerRadius时,需要在应用cornerRadius之前添加一行代码。

yourButton.layoutIfNeeded()

例子变成Objective C.

[yourButton layoutIfNeeded];
yourButton.layer.cornerRadius = yourButton.frame.size.height/2;
[[yourButton layer] setBorderWidth:2.0f];
Example into Swift3

self.layoutIfNeeded()
yourButton.layer.cornerRadius = self.frame.height / 2.0
yourButton.layer.borderWidth = 2.0

如前一个答案所述,在更改角半径之前添加 self.layoutIfNeeded() 对我有用。

swift 3

我将尝试使用此代码来定义 UIImageview 的圆角半径

 imgProfile.layer.cornerRadius = imgProfile.frame.size.width / 2
            imgProfile.clipsToBounds = true

在 swift 中标记为 @IBInspectable(或在 Objective-C 中标记为 IBInspectable),它们可以在 Interface Builder 的属性检查器面板中轻松编辑。
您可以直接在属性检查器

中设置cornerRadius
extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }
}

Swift 3.2 解

如果有人仍然遇到这个问题,我通过在 viewDidLayoutSubviews 中舍入单元格(或其任何子视图)解决了这个问题。

override func viewDidLayoutSubviews() {
    if (tableView.visibleCells.count > 0) {
        for cell in tableView.visibleCells {
            let customCell = cell as! CustomCell
            // Use any rounding method you use
            customCell.exampleSubview.roundCorners(corners: .allCorners, radius: 6) 
            customCell.exampleSubview.layoutIfNeeded()
        }
    }
}