【问题标题】:Xcode 8 - Some buttons border removedXcode 8 - 删除了一些按钮边框
【发布时间】: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 请检查我的回答并回复
  • 好的,很快就会检查,谢谢

标签: ios iphone xcode uibutton xcode8


【解决方案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 了解更多信息。

        【讨论】:

          猜你喜欢
          • 2016-07-24
          • 2012-07-14
          • 1970-01-01
          • 2022-01-01
          • 2017-04-01
          • 2015-09-01
          • 2021-07-25
          • 2020-03-27
          • 2015-12-16
          相关资源
          最近更新 更多