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中的视图框架不正确,这会导致拐角半径错误。但是,如果使用自动调整大小,则不会出现此问题