Xcode 8 - 删除了一些按钮边框
Posted
技术标签:
【中文标题】Xcode 8 - 删除了一些按钮边框【英文标题】:Xcode 8 - Some buttons border removed 【发布时间】:2016-09-14 09:25:59 【问题描述】:我刚刚将我的 Xcode 版本从 7.3 更新到 8.0,一些按钮边框消失了。
代码看起来不错,所以我真的不知道图层发生了什么。 顺便说一句 - 在其他一些控制器中,我可以看到图层边界。
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
之前:(图像仅作为示例-边框实时看起来不同)
现在:
【问题讨论】:
在最后尝试这一行:self.button.clipsToBounds = YES 令人惊讶的是,即使您之前的按钮角半径似乎也不是按钮高度的一半。 图片只是举例... @Asi Givati 请检查我的回答并回复 好的,很快就会检查,谢谢 【参考方案1】:原因是 XCode 8 引入了一种放大 Storyboard 的新方法。
在 XCode 8 之前,在视图控制器生命周期中,frames
在 viewDidLoad(或属性 didSet
)中是未知的。您必须等到 viewDidLayoutSubviews (这是 Autolayout 完成应用约束以确定主视图中每个子视图的帧的时间。
但是bounds
在此之前是可以访问的:它们只是被设置为故事板中 IBOutlet 的大小。
在 XCode 8 中,情况有所不同:由于其新的缩放系统,即使 bounds
在 ViewDidLayoutSubviews 之前也不正确(它们可能存在,但具有 1000 x 1000 之类的虚拟值)。
总结:
您可以在 viewDidLoad 或 IBOutlet 中使用cornerRadius 之类的东西 didSet,只要你使用固定值 如果你需要根据bounds
定义你的cornerRadius,那么在viewDidLayoutSubviews中这样做,或者使用NSLayoutConstraints(它们的值是固定的并且从Autolayout知道)
如果您需要在 views 中使用cornerRadius(如 UITableViewCell 或 UICollectionViewCell 子类),那么您可以在 layoutSubviews
中使用(但您需要提供固定值或 NSLayoutConstraint常量为cornerRadius),或awakeFromNib
(在这种情况下,只需在执行任何与框架或边界相关的操作之前添加self.layoutIfNeeded
,以强制单元格重新计算其子视图的框架)。
【讨论】:
1000 x 1000 - 它正是我看到的导致问题的虚拟框架。现在,在您的出色回答之后-下次我会更好地了解如何处理它:) 浪费这么多时间调试这个真是令人沮丧!感谢分享。 与 viewDidLayoutSubviews 类似的用于加载 Storyboard 中内置的自定义视图的函数是什么?awakeFromNib
和 init?(coder aDecoder: NSCoder)
也显示了 Xcode 8 中的虚拟 1000x1000 帧大小,尽管这在 Xcode 7 中有效。
'LayoutSubviews' 出现在视图控制器的 'ViewWillLayoutSubviews' 和 'ViewDidLayoutSubviews' 之间的自定义视图中
@Crashalot 您是否设法解决了这个问题。我和你有同样的问题。你是怎么解决的?【参考方案2】:
我觉得有问题:
CGRectGetHeight(self.button.frame) / 2;
当您设置角时,我认为高度按钮没有价值或价值较大的边框不会显示。你可以试试改成
self.button.layer.cornerRadius = 15;
如果可行,我认为您可以检查您的逻辑并在高度按钮获得正确值时进行设置。
【讨论】:
但是直到昨天我使用 Xcode 7 时它才起作用 :) 我明白了。但是现在你使用 xcode8 和 ios 10 所以发生了一些变化。 这就是问题所在。在 Xcode 7 CGRectGetHeight(self.button.frame) / 2 中工作得很好,但现在由于某种原因我必须为此按钮添加高度约束并将其拆分为 2 以获得角半径的正确高度。 @AsiGivati yup 有同样的问题,即帧值在 Xcode 8 中不再有效,但在 Xcode 7 中有效。啊! @Crashalot - 这是一个简单的解决方法 - 只需将您的代码从“viewDidLoad”移动到“viewDidLayoutSubviews”【参考方案3】:试试这个并检查:
#import <QuartzCore/QuartzCore.h>
self.button.layer.borderColor = [UIColor whiteColor].CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = 5; // Change this value on your requirement
self.button.clipsToBounds = YES;
【讨论】:
【参考方案4】:要强制计算视图框架,您可以尝试使用 layoutIfNeeded。 例如对于 UITableViewCell 中的标签:
override func awakeFromNib()
super.awakeFromNib()
self.layoutIfNeeded()
self.qualityIndexLabel.makeRound()
【讨论】:
【参考方案5】:使用 dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2; );
【讨论】:
【参考方案6】:RoundedRect 已弃用,请改用 UIButtonTypeSystem。 请参阅https://developer.apple.com/reference/uikit/uibutton?language=objc 了解更多信息。
【讨论】:
以上是关于Xcode 8 - 删除了一些按钮边框的主要内容,如果未能解决你的问题,请参考以下文章