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 在 vi​​ewDidLoad(或属性 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 中内置的自定义视图的函数是什么? awakeFromNibinit?(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 - 删除了一些按钮边框的主要内容,如果未能解决你的问题,请参考以下文章

如何从输入按钮中删除轮廓边框

如何删除自定义按钮上的细边框?

从按钮中删除边框

Fullcalendar 删除按钮边框/阴影

在 Xcode 8 和 Swift 3.0 中删除覆盖后准备 segue 崩溃

删除点击按钮周围的边框[重复]