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()
}
}
}
我在 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 的属性检查器面板中轻松编辑。
您可以直接在属性检查器
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()
}
}
}