Ответ 1
Xcode 7.3 в правом нижнем углу: добавьте ограничение по высоте в столбце.
Заметьте, я хочу сделать строку 1px, а не строку 1pt. Это означает, что он должен быть 1px, независимо от масштаба экрана (так что 0.5pt на устройствах Retina).
Я могу сделать это программно, но могу ли я сделать это в Interface Builder? Например, я не могу установить, чтобы UIView имел высоту менее 1.
Если я могу сделать это в IB, мне не нужно объявлять розетку и вручную устанавливать кадр в awakeFromNib
.
Xcode 7.3 в правом нижнем углу: добавьте ограничение по высоте в столбце.
На всякий случай, когда кто-то приходит сюда, желая узнать, как это можно сделать программно, вот как вы это делаете:
Сделайте ограничение высоты в IB на нужное представление и установите константу в значение 1.
Затем вам понадобится CTRL + Перетащить из ограничения в ваш пользовательский вид или ViewController.
Всякий раз, когда Xib загружается, будь то в awakeFromNib
или viewDidLoad
, вы собираетесь установить константу ограничения на шкалу дисплея:
onePixelViewHeightConstraint.constant = 1/UIScreen.main.scale//enforces it to be a true 1 pixel line
self.onePixelViewHeightConstraint.constant = 1.f/[UIScreen mainScreen].scale;//enforces it to be a true 1 pixel line
Enjoy
Создав этот крошечный подкласс NSLayoutConstraint
, теперь я могу добавить 1px строки в IB:
@implementation NSLayoutConstraintHairline
-(void)awakeFromNib
{
[super awakeFromNib];
if ( self.constant == 1 ) self.constant = 1/[UIScreen mainScreen].scale;
}
@end
Любое ограничение со значением 1 может быть установлено в класс NSLayoutConstraintHairline
, чтобы сделать константу эффективно 1px вместо 1pt.
Если вы когда-либо решили изменить константу на другое значение, она будет работать как любое другое ограничение.
С 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.
Перейдите к свойствам и установите значение.
В приведенном выше примере он отобразит высоту 1 px на устройствах 1x, 2x и 3x.
Я создал подкласс NSLayoutConstraint
:
class HairlineConstraint: NSLayoutConstraint {
override func awakeFromNib() {
super.awakeFromNib()
self.constant = 1.0 / UIScreen.main.scale
}
}
Затем просто создайте свой вид в построителе интерфейса, добавьте ограничение высоты
и установите его класс в HairlineConstraint
.
Готово.
В Swift:
@IBOutlet var hairlineConstraint: NSLayoutConstraint! {
didSet {
hairlineConstraint.constant = 1 / UIScreen.mainScreen().scale
}
}
РЕДАКТИРОВАТЬ: этот ответ был предназначен только для устройств с 2x2. В то время @3x еще не появился на рынке!
В настоящее время ответ @mdvs
кажется самым чистым.
Создание 1px-линии в IB затруднено даже для устройств с сетчаткой. Наконец, я достиг этого, используя User Defined Runtime Attributes
.
Вот скриншот для установки ограничения высоты на 0,5 px (что составляет 1px на устройствах сетчатки).
Основываясь на ответе @Nevs12 и его комментариях, я думаю, что имеет смысл использовать такую вещь:
extension NSLayoutConstraint {
@IBInspectable var usePixels: Bool {
get {
return false // default Value
}
set {
if newValue {
constant = constant / UIScreen.mainScreen().scale
}
}
}
}
Кажется, что это невозможно, нужно сделать это программно или создать пользовательский вид.
Вы можете сделать это в файле .xib. Просто отредактируйте его как текст и установите константу = "0,5" вместо "1" в вашем ограничении высоты просмотра
<constraints>
<constraint firstAttribute="height" constant="0.5" id="xUN-dm-ggj"/>
</constraints>