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

Swift3 cornerRadius在Swift 2.3/iOS 10/Xcode 8中停止工作,swift3,ios10,swift2.3,Swift3,Ios10,Swift2.3,我在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时,它工作正常 可能是什么问题

我在
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
移动到
viewdidappease
,问题已经解决

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


如果是UITableViewCell,则从NIB内部
唤醒
添加
[自布局需要]在更新拐角半径之前,应解决所有问题

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

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

希望这对你有用


如果您仍想在awakefromnib中执行此操作,请在放置一些延迟后执行此操作(使用dispatch_after或NSOperatinQueue或PerformSelector WithDelay)

如果它位于您的一个
ViewController
中,而不是将所有层操作移动到
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();
        });

对我来说,它的工作原理是第一次调用LayoutFneeded,然后在WWDC 2016中设置cornerRadius

自动布局的新功能,苹果推荐了一种名为

逐步采用自动布局

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


因此,解决方案之一是使用自动调整大小,您可以随时获得视图的正确帧。但是前提是自动调整大小可以满足您的布局

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

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

XCode8中有一个新的东西,我们不能直接设置层的角半径

当您想要应用UIView的cornerRadius时,需要在应用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

如前一个回答中所述,在更改拐角半径之前添加
self.layoutifneed()
对我很有效。

swift 3

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

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

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

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

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

Swift 3.2解决方案

如果有人仍然有这个问题,我通过取整ViewDidLayoutSubView中的单元格(或其任何子视图)来解决这个问题

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

这是一个你在哪里做这件事的问题。例如,如果在
init
viewDidLoad
中执行此操作,则约束可能尚未应用,因此视图的位置仍然不确定。您可以在视图构建过程中稍后执行此操作来解决此问题,例如
viewdideappear
viewdidelayoutsubviews
。您好@Rob:谢谢您的回复,我已经尝试过将代码从
viewdideload
移动到
viewdideappear
,效果很好:)谢谢!由于更新,我还不得不修复我的自定义按钮。我在视图中应用了角半径。不过,在ViewDidDisplay中应用拐角半径并不是一个很好的解决方案。奇怪的是,这已经不可能了…self.view.layoutIfNeeded()在设置角半径之前添加这条线。apple完全是胡说八道。。。在没有任何文件的情况下,这些更改。。。我在awakeFromNib中更改转弯半径,导致背景色消失,我不明白。。按钮的背景颜色和拐角半径之间的关系是什么。完全是胡说八道这对我有用,但对约束更新来说。在iOS 9中工作,在iOS 10中中断。ViewDidDisplay会导致视图属性(如角点)的可见弹出。我也有同样的问题,最后用YPK的答案解决了。我认为这应该是可以接受的,因为ViewDidExeed有令人讨厌的副作用。@Ryan:在代码之前添加self.view.layoutIfNeeded(),也可以解决viewDidLoad本身的问题。在ViewDidExeed中使用代码可以很好地工作,而不使用self.view.layoutIfNeeded()[self-layoutIfNeeded];在更新角半径之前,应该解决所有问题。@JRafaelM也许我应该详细解释一下。现在几乎每个人都使用自动布局来确保位置和边界。之后,您会发现viewDidLoad中的视图框架不正确,这会导致拐角半径错误。但是,如果使用自动调整大小,则不会出现此问题