33

我在 a和 a里面有一个cornerRadius集合。我正在计算拐角半径,但 UIView 在 iOS 10 中停止显示。UIViewUIImageViewUIViewRockProfileView.frame.size.height / 2

进一步检查后,我发现值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
4

12 回答 12

34

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

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

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

于 2016-09-15T15:44:49.587 回答
8

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

然后我将此代码移至layoutSubViews方法。然后它起作用了。

希望,这对你有用。

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

于 2016-09-20T05:52:15.553 回答
4

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

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

希望这对你有帮助

于 2016-09-22T19:46:14.770 回答
3

新到 XCode8 我们不能直接设置图层的cornerRadius。

当你想应用 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
于 2016-10-07T06:08:46.367 回答
2

对我来说,它首先调用 layoutIfNeeded ,然后调用 set cornerRadius

于 2016-09-27T11:19:26.213 回答
1

迅速 3

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

 imgProfile.layer.cornerRadius = imgProfile.frame.size.width / 2
            imgProfile.clipsToBounds = true
于 2017-05-18T09:54:35.270 回答
1

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

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }
}
于 2017-06-02T05:47:59.693 回答
0

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

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

DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            SetYourViewProperties();
        });
于 2016-09-23T13:22:52.183 回答
0

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

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});
于 2016-10-02T05:57:51.497 回答
0

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

于 2016-11-05T18:35:36.803 回答
0

斯威夫特 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()
        }
    }
}
于 2017-12-31T14:33:34.127 回答
-1

在 WWDC 2016 | What's New in Auto Layout,苹果推荐一种名为的自动布局方式

逐步采用自动布局

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

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

于 2016-09-28T03:21:50.010 回答