如何在Interface Builder中创建1px行?

i_a*_*orf 33 interface-builder uikit ios retina-display

注意,我想制作1px线,而不是1pt线.意思是它应该是1px而不管屏幕比例(因此在Retina设备上为0.5pt).

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

如果我可以在IB中执行此操作,那么我不必声明插座并手动设置框架awakeFromNib.

Dan*_*sko 50

以防其他人来这里想知道如何以编程方式完成,以下是你如何做到的:

Interface Builder

在IB中将高度约束设置为所需视图,并将常量设置为1.

在此输入图像描述

然后,您需要从约束中按CTRL +拖动到自定义视图或ViewController中.

每当XIB被加载,无论是在awakeFromNibviewDidLoad,你要设置约束到显示器的规模的不断:

迅速

onePixelViewHeightConstraint.constant = 1/UIScreen.main.scale//enforces it to be a true 1 pixel line
Run Code Online (Sandbox Code Playgroud)

Objective-C的

self.onePixelViewHeightConstraint.constant = 1.f/[UIScreen mainScreen].scale;//enforces it to be a true 1 pixel line
Run Code Online (Sandbox Code Playgroud)

请享用

  • 看起来在IB中无法完成. (3认同)

Mar*_*tis 36

我创建了NSLayoutConstraint子类:

class HairlineConstraint: NSLayoutConstraint {
    override func awakeFromNib() {
        super.awakeFromNib()

        self.constant = 1.0 / UIScreen.main.scale
    }
}
Run Code Online (Sandbox Code Playgroud)

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

具有高度约束的自定义视图

并将其类设置为HairlineConstraint.

设置约束类

完成.


mvd*_*vds 27

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

@implementation NSLayoutConstraintHairline

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

@end
Run Code Online (Sandbox Code Playgroud)

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

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

  • 到目前为止,我能找到最干净的方式,谢谢! (3认同)

Nev*_*s12 26

随着6的Xcode和引进@IBInspectable@IBDesignable关键字,它肯定是可能的,相当简单.无需子类/插入任何东西.

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

extension NSLayoutConstraint {

    @IBInspectable var preciseConstant: Int {
        get {
            return Int(constant * UIScreen.mainScreen().scale)
        }
        set {
            constant = CGFloat(newValue) / UIScreen.mainScreen().scale
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

IB对象导航器部分

转到它的属性并设置值.

NSLayoutConstraint的IB属性

在上面的例子中,它将在1x,2x和3x设备上渲染1 px高度的视图.

  • 这很酷.但是相当模糊的是你现在有两个竞争字段指定实际的`constant`字段.是否保证"精确常数"总是从实际常数中获胜?现在和未来?我有一些错误,这些错误源于版本X和Y之间执行顺序的变化...... (2认同)

Rud*_*vič 13

在Swift中:

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


Mic*_*gar 8

编辑:这个答案是针对@ 2x唯一的设备.当时@ 3x尚未上市!

如今,@mdvs答案似乎是最干净的.


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

这是一个截图,用于将高度约束设置为0.5像素(在视网膜设备上为1像素).

  • 这打破了iPhone 6 Plus. (4认同)

far*_*bfn 5

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

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


小智 -8

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

Xcode 7.3 右下角:在 Pin 中添加高度约束。