Jak utworzyć linię 1px w Interface Builder?

Uwaga, chcę zrobić linię 1px, a nie linię 1pt. Oznacza to, że powinno być 1px niezależnie od skali ekranu (więc 0,5 pkt na urządzeniach siatkówki).

Mogę to zrobić programowo, ale czy mogę to zrobić w Kreatorze interfejsów? Na przykład nie mogę ustawić UIView na wysokość mniejszą niż 1.

Jeśli mogę to zrobić w IB to nie muszę deklarować gniazdka i ręcznie ustawiać ramki w awakeFromNib.

Author: i_am_jorf, 2014-05-15

10 answers

 -8
Author: user5158717,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 11:49:40

Na wypadek, gdyby ktoś inny chciał wiedzieć, jak można to zrobić programowo, oto jak ty to robisz:

Interface Builder

Ustaw ograniczenie wysokości w IB do żądanego widoku i ustaw stałą na 1.

Tutaj wpisz opis obrazka

Następnie będziesz musiał CTRL + przeciągnąć z ograniczenia do własnego widoku lub kontrolera ViewController.

Gdy XIB zostanie załadowany, czy to w awakeFromNib Czy viewDidLoad, ustawisz stałą ograniczenia na skalę wyświetlacz:

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

 47
Author: Daniel Galasko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 07:55:44

Tworząc tę małą podklasę NSLayoutConstraint mogę teraz dodać linie 1px w IB:

@implementation NSLayoutConstraintHairline

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

@end

Dowolne ograniczenie o wartości 1 może być ustawione na klasę NSLayoutConstraintHairline, aby stała stała efektywnie wynosiła 1px zamiast 1pt.

Jeśli kiedykolwiek zdecydujesz się zmienić stałą na inną wartość, będzie ona działać jak każde inne ograniczenie.

 27
Author: mvds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 20:29:16

Z xCode 6 i wprowadzenie słów kluczowych @IBInspectable i @IBDesignable jest to zdecydowanie możliwe i raczej proste. Nie ma potrzeby podklasowania / gniazdka czegokolwiek.

Możesz zrobić rozszerzenie (category) dla NSLayoutConstraint z następującym kodem (swift):

extension NSLayoutConstraint {

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

Następnie możesz wybrać potrzebne ograniczenie w swoim IB.

IB objects Navigator part

Przejdź do jego właściwości i ustaw wartość.

IB właściwości NSLayoutConstraint

W powyższym przypadku renderuje widok o wysokości 1 px na urządzeniach 1x, 2x i 3x.

 25
Author: Nevs12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 11:05:53

Utworzyłem NSLayoutConstraint podklasę:

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

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

Następnie po prostu utwórz swój widok w interface builder, dodaj ograniczenie wysokości

Widok niestandardowy z ograniczeniem wysokości

I ustawić jego klasę na HairlineConstraint.

Set constraint class

Zrobione.
 25
Author: Marius Kažemėkaitis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-17 01:43:24

W Języku Swift:

@IBOutlet var hairlineConstraint: NSLayoutConstraint! {
    didSet {
        hairlineConstraint.constant = 1 / UIScreen.mainScreen().scale
    }
}
 13
Author: Rudolf Adamkovič,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-30 09:22:52

EDIT: ta odpowiedź była tylko dla urządzeń @2x. W tym czasie @3x nie było jeszcze na rynku!

W dzisiejszych czasach odpowiedź @mdvs wydaje się być najczystsza.


Tworzenie linii 1px w IB jest trudne nawet dla urządzeń tylko siatkówki. W końcu udało mi się to osiągnąć za pomocą User Defined Runtime Attributes.

Oto zrzut ekranu do Ustawienia ograniczenia wysokości na 0.5 px(co jest 1px w urządzeniach siatkówki).

 8
Author: Michał Zygar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 14:49:47

Bazując na odpowiedzi @Nevs12 i komentarzach, myślę, że bardziej sensowne jest używanie takich rzeczy:

extension NSLayoutConstraint {
    @IBInspectable var usePixels: Bool {
        get {
            return false // default Value
        }
        set {
            if newValue {
                constant = constant / UIScreen.mainScreen().scale
            }
        }
    }
}
 4
Author: farzadshbfn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-03 13:27:36

Wydaje się, że nie jest to możliwe, trzeba to zrobić programowo lub zbudować własny widok.

 2
Author: i_am_jorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 22:19:18

Możesz to zrobić w .plik xib. Po prostu edytuj go jako tekst i ustaw stałą="0.5" zamiast " 1 " w ograniczeniu wysokości widoku

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

In Interface Builder

 1
Author: Andrey Snetkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 05:34:39