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

问题描述 投票:30回答:12

我有一个cornerRadius设置在UIViewUIImageView内同一UIView。我用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
swift3 ios10 swift2.3
12个回答
32
投票

正如Rob所回答的那样,我已经将代码从viewDidLoad移到了viewDidAppear,问题就解决了。

或者在self.view.layoutIfNeeded()中的代码之前添加viewDidLoad也解决了这个问题。

在UITableViewCell的情况下,在更新角半径之前添加awakeFromNib内部[self layoutIfNeeded];应解决所有问题。


0
投票

如前面的答案中所述,在改变角半径之前添加self.layoutIfNeeded()对我有用。


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()
        }
    }
}

-1
投票

在WWDC 2016 |在Auto Layout中有什么新功能,Apple推荐了一种名为autolayout的方法

逐步采用Autolayout

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

因此,其中一个解决方案是使用自动调整功能,您可以随时获得有关视图的正确框架。但前提是自动调整可以满足您的布局


8
投票

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

然后我将此代码移动到layoutSubViews方法。然后它奏效了。

希望,这对你有用。

如果你想在awakefromnib中仍然这样做,那么在放置一些延迟后(通过使用dispatch_after或NSOperatinQueue或performSelectorWithDelay)执行此操作


4
投票

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

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

希望这对你有所帮助


3
投票

新的一件事进入XCode8我们无法直接设置图层的cornerRadius。

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

yourButton.layoutIfNeeded()

目标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

2
投票

对我而言,它的工作原理是先调用layoutIfNeeded,然后再调用cornerRadius


1
投票

迅捷3

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

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

1
投票

在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
    }
  }
}

0
投票

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

我正在使用Xamarin,因此语法有点不同:

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

0
投票

我不得不在主线程上运行它才能工作。

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});
© www.soinside.com 2019 - 2024. All rights reserved.