我有一个cornerRadius
设置在UIView
和UIImageView
内同一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
正如Rob所回答的那样,我已经将代码从viewDidLoad
移到了viewDidAppear
,问题就解决了。
或者在self.view.layoutIfNeeded()
中的代码之前添加viewDidLoad
也解决了这个问题。
在UITableViewCell的情况下,在更新角半径之前添加awakeFromNib
内部[self layoutIfNeeded];
应解决所有问题。
如前面的答案中所述,在改变角半径之前添加self.layoutIfNeeded()
对我有用。
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()
}
}
}
在WWDC 2016 |在Auto Layout中有什么新功能,Apple推荐了一种名为autolayout的方法
逐步采用Autolayout
这意味着如果布局很简单,您可以使用自动调整大小。它将在运行时转化为约束。
因此,其中一个解决方案是使用自动调整功能,您可以随时获得有关视图的正确框架。但前提是自动调整可以满足您的布局
我在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
}
希望这对你有所帮助
新的一件事进入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
对我而言,它的工作原理是先调用layoutIfNeeded,然后再调用cornerRadius
迅捷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
}
}
}
我有同样的问题,仅限iOS 10。我发现ViewDidLayoutSubviews或ViewDidLoad(可能是其他人,但我没有检查)只有在我按照YPK建议将布局代码包装在调度队列中时才有效。
我正在使用Xamarin,因此语法有点不同:
DispatchQueue.MainQueue.DispatchAsync(() =>
{
SetYourViewProperties();
});
我不得不在主线程上运行它才能工作。
dispatch_async(dispatch_get_main_queue(), ^{
[imageView.layer setCornerRadius:4];
[imageView.layer setMasksToBounds:YES];
});