Как создать строку 1px в Interface Builder?

Заметьте, я хочу сделать строку 1px, а не строку 1pt. Это означает, что он должен быть 1px, независимо от масштаба экрана (так что 0.5pt на устройствах Retina).

Я могу сделать это программно, но могу ли я сделать это в Interface Builder? Например, я не могу установить, чтобы UIView имел высоту менее 1.

Если я могу сделать это в IB, мне не нужно объявлять розетку и вручную устанавливать кадр в awakeFromNib.

Ответ 2

На всякий случай, когда кто-то приходит сюда, желая узнать, как это можно сделать программно, вот как вы это делаете:

Конструктор интерфейсов

Сделайте ограничение высоты в IB на нужное представление и установите константу в значение 1.

enter image description here

Затем вам понадобится CTRL + Перетащить из ограничения в ваш пользовательский вид или ViewController.

Всякий раз, когда Xib загружается, будь то в awakeFromNib или viewDidLoad, вы собираетесь установить константу ограничения на шкалу дисплея:

Swift

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

Objective-C

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

Enjoy

Ответ 3

Создав этот крошечный подкласс NSLayoutConstraint, теперь я могу добавить 1px строки в IB:

@implementation NSLayoutConstraintHairline

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

@end

Любое ограничение со значением 1 может быть установлено в класс NSLayoutConstraintHairline, чтобы сделать константу эффективно 1px вместо 1pt.

Если вы когда-либо решили изменить константу на другое значение, она будет работать как любое другое ограничение.

Ответ 4

С xCode 6 и введением ключевых слов @IBInspectable и @IBDesignable это определенно возможно и довольно просто. Нет необходимости в подклассе/выходе.

Вы можете сделать расширение (категорию) для NSLayoutConstraint со следующим кодом (быстрый):

extension NSLayoutConstraint {

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

Затем вы можете выбрать необходимое ограничение в своей IB.

IB objects navigator part

Перейдите к свойствам и установите значение.

IB properties of NSLayoutConstraint

В приведенном выше примере он отобразит высоту 1 px на устройствах 1x, 2x и 3x.

Ответ 5

Я создал подкласс NSLayoutConstraint:

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

        self.constant = 1.0 / UIScreen.main.scale
    }
}

Затем просто создайте свой вид в построителе интерфейса, добавьте ограничение высоты

Пользовательский вид с ограничением высоты

и установите его класс в HairlineConstraint.

Установить класс ограничения

Готово.

Ответ 6

В Swift:

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

Ответ 7

РЕДАКТИРОВАТЬ: этот ответ был предназначен только для устройств с 2x2. В то время @3x еще не появился на рынке!

В настоящее время ответ @mdvs кажется самым чистым.


Создание 1px-линии в IB затруднено даже для устройств с сетчаткой. Наконец, я достиг этого, используя User Defined Runtime Attributes.

Вот скриншот для установки ограничения высоты на 0,5 px (что составляет 1px на устройствах сетчатки).

Ответ 8

Основываясь на ответе @Nevs12 и его комментариях, я думаю, что имеет смысл использовать такую ​​вещь:

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

Ответ 9

Кажется, что это невозможно, нужно сделать это программно или создать пользовательский вид.

Ответ 10

Вы можете сделать это в файле .xib. Просто отредактируйте его как текст и установите константу = "0,5" вместо "1" в вашем ограничении высоты просмотра

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

В интерфейсе Builder