【问题标题】:How do I create a 1px line in Interface Builder?如何在 Interface Builder 中创建 1px 线?
【发布时间】:2014-05-14 22:26:29
【问题描述】:

注意,我希望制作一条 1px 的线,而不是 1pt 的线。这意味着无论屏幕比例如何,它都应该是 1px(因此在 Retina 设备上为 0.5pt)。

我可以通过编程方式执行此操作,但我可以在 Interface Builder 中执行此操作吗?例如,我不能将 UIView 的高度设置为小于 1。

如果我可以在 IB 中做到这一点,那么我不必声明一个出口并在 awakeFromNib 中手动设置框架。

【问题讨论】:

  • 嗯...那么不要在 IB 中这样做...您可以创建自定义视图来进行绘图并使用自定义视图?
  • 是的,我可以。但如果我能在 IB 中做到保持一致,那就太好了。如果不可能,那也没关系。看来应该可以了。
  • 如果您想将它们用作边框或其他东西...我认为最好使用CALayer(如果可能的话),UIViews 这样使用效率不是很高事情。

标签: ios uikit interface-builder retina-display


【解决方案1】:

以防万一其他人来到这里想知道如何以编程方式完成它,您可以这样做:

界面生成器

在 IB 中对所需视图进行高度约束并将常量设置为 1。

然后你需要 CTRL+Drag 从约束到你的自定义视图或 ViewController。

每当加载 Xib 时,无论是在 awakeFromNib 还是 viewDidLoad,你都要将约束的常数设置为显示的比例:

斯威夫特

onePixelViewHeightConstraint.constant = 1/UIScreen.main.scale//enforces it to be a true 1 pixel line

目标-C

self.onePixelViewHeightConstraint.constant = 1.f/[UIScreen mainScreen].scale;//enforces it to be a true 1 pixel line

享受

【讨论】:

    【解决方案2】:

    我创建了NSLayoutConstraint 子类:

    class HairlineConstraint: NSLayoutConstraint {
        override func awakeFromNib() {
            super.awakeFromNib()
    
            self.constant = 1.0 / UIScreen.main.scale
        }
    }
    

    然后只需在界面生成器中创建您的视图,添加高度约束

    并将其类设置为HairlineConstraint

    完成。

    【讨论】:

    • 美丽。现代的。完美。
    • 等等——这些天“它可能不会落在整数像素上”的问题呢......?
    【解决方案3】:

    通过创建NSLayoutConstraint 的这个小子类,我现在可以在 IB 中添加 1px 行:

    @implementation NSLayoutConstraintHairline
    
    -(void)awakeFromNib
    {
        [super awakeFromNib];
        if ( self.constant == 1 ) self.constant = 1/[UIScreen mainScreen].scale;
    }
    
    @end
    

    任何值为 1 的约束都可以设置为 NSLayoutConstraintHairline 类,以使常量有效地变为 1px 而不是 1pt。

    如果您决定将常量更改为另一个值,它将像任何其他约束一样工作。

    【讨论】:

    • 用xCode6可以做得更清楚,请看我的回答。
    【解决方案4】:

    使用 Xcode 6 并引入 @IBInspectable@IBDesignable 关键字,这绝对是可能的,而且相当简单。无需子类化/输出任何东西。

    您可以使用以下代码 (swift) 为 NSLayoutConstraint 进行扩展(类别):

    extension NSLayoutConstraint {
    
        @IBInspectable var preciseConstant: Int {
            get {
                return Int(constant * UIScreen.mainScreen().scale)
            }
            set {
                constant = CGFloat(newValue) / UIScreen.mainScreen().scale
            }
        }
    }
    

    然后您可以在 IB 中选择所需的约束。

    转到其属性并设置值。

    在上述情况下,它将在 1x、2x 和 3x 设备上呈现高度为 1 px 的视图。

    【讨论】:

    • 这很酷。但相当模糊的是,您现在有两个竞争字段指定实际的 constant 字段。是否保证“精确常数”总是从实际常数中获胜?现在和将来?我遇到了一些错误,这些错误源于版本 X 和 Y 之间的执行顺序变化......
    • 好吧,只要@IBInspectable 只是用户定义的运行时属性的一个简单包装器,我希望不会有任何问题,因为它们总是在初始视图加载后设置在 awakeFromNib()使用 setValue:forKeyPath: (apple doc)
    【解决方案5】:

    在斯威夫特中:

    @IBOutlet var hairlineConstraint: NSLayoutConstraint! {
        didSet {
            hairlineConstraint.constant = 1 / UIScreen.mainScreen().scale
        }
    }
    

    【讨论】:

      【解决方案6】:

      编辑:此答案仅适用于 @2x 设备。当时@3x 还没有上市!

      如今,@mdvs 的回答似乎是最干净的。


      即使对于仅支持视网膜的设备,在 IB 中制作 1px 线也很困难。最后,我使用User Defined Runtime Attributes 实现了它。

      这是将高度约束设置为 0.5 像素(在视网膜设备上为 1 像素)的屏幕截图。

      【讨论】:

      • 这在 iPhone 6 Plus 上中断。
      • 这意味着在 iP6 代发布之前的时代。现在肯定已经过时了。
      【解决方案7】:

      基于@Nevs12 的回答和它的 cmets,我认为使用这样的东西更有意义:

      extension NSLayoutConstraint {
          @IBInspectable var usePixels: Bool {
              get {
                  return false // default Value
              }
              set {
                  if newValue {
                      constant = constant / UIScreen.mainScreen().scale
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案8】:

        似乎不可能,必须以编程方式或构建自定义视图。

        【讨论】:

        • 我认为只做 IB 是可能的,请看我的回答
        【解决方案9】:

        您可以在 .xib 文件中执行此操作。只需将其编辑为文本并在视图高度约束中设置常量 =“0.5”而不是“1”

        <constraints>
        <constraint firstAttribute="height" constant="0.5" id="xUN-dm-ggj"/>
        </constraints>
        

        In Interface Builder

        【讨论】:

          【解决方案10】:

          通过 Interface Builder 添加0.5 像素高度约束:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-21
            • 2011-09-27
            • 2012-08-15
            • 2017-11-21
            • 2016-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多