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
.
10 answers
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.
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
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.
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.
Przejdź do jego właściwości i ustaw wartość.
W powyższym przypadku renderuje widok o wysokości 1 px na urządzeniach 1x, 2x i 3x.
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
I ustawić jego klasę na HairlineConstraint
.
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
}
}
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).
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
}
}
}
}
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.
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>
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