rozszerzenie aplikacji iOS 10 iMessage: jak obliczyć wysokość dodatkowego wysokiego paska nawigacyjnego
Pobrałem Xcode 8 beta i próbowałem bawić się z iMessages app Extension sdk, ale napotkałem problem z ich pozornie niestandardową wysokością paska nav
Kiedy przejdę do widoku rozszerzonego aplikacji, Mój obraz z następującą ramką CGRect(x: 0, y: 0, width: 100, height: 100)
kończy się częściowo ukryty za paskiem nawigacyjnym. chciałbym, aby pojawił się poniżej paska nawigacyjnego.
Próbowałem self.navigationController?.navigationBar.isTranslucent = false
, ale to nie działa, co chyba ma sens, ponieważ jest poza zasięgiem mojej aplikacji do kontroli.
Ma ktoś już się tym bawił? chcę uniknąć dwóch rzeczy. wystarczy odgadnąć odpowiednią wysokość i odejść od rozwiązania programowego. dzięki za pomoc
8 answers
Może pomóc mieć ograniczenie z przewodnikiem top layout tak:
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
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-08-19 23:03:02
Możesz uzyskać wysokość z podręcznika układu kontrolera:
self.topLayoutGuide.length
Powodem, dla którego demo @Dilts działa, jest to, że górne etykiety są ograniczone do Przewodnika po górnym układzie. Jeśli są ograniczone do superview, to również pójdzie za barem.
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-08-04 13:21:38
Jeśli jesteś podobny do mnie i nadal uważasz, że Auto Layout
jest trudny w użyciu, możesz użyć metody viewDidLayoutSubviews
, aby automatycznie dostosować rozmiar widoku. Mam widok tabeli z tym samym problemem co ty, więc użyłem tej prostej metody, aby zmienić wstawkę zawartości górnej strony widoku tabeli:
-(void)viewDidLayoutSubviews {
[self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}
Jak na razie działa dobrze (zarówno w portrecie, jak i w krajobrazie) na wszystkich iDevices.
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-09-20 13:35:31
Aby odpowiedzieć na twoje pytanie: "Jaka jest wysokość extra tall navbar":
86px
UPDATE
O pasku nawigacyjnym ukrywającym Twój UI. Zrobiłem szybkie demo i nie miałem problemów.
Dodałem kilka etykiet na górze widoku(tuż pod paskiem stanu, w punkcie y wartość 20). Następnie dodałem 2 ograniczenia: wiodący i górny dla lewej etykiety i końcowy i górny dla prawej Etykieta.
To był mój wynik, zarówno w trybie kompaktowym, jak i rozszerzonym. Więc po prostu upewnij się, że umieścisz swoje komponenty poniżej wartości punktu y 20 i masz pewne ograniczenia, w ten sposób Apple przekaże Ci zmianę rozmiaru widoku!
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-06-17 17:59:44
Jeśli ustawisz górny przewodnik po Układzie jako górne ograniczenie, działa ON dla MSMessagesAppViewController. Ale to nie będzie działać na UIViewControllers, ponieważ Przewodniki układu są różne.
O ile nie musisz używać klasy UIViewController z jakiegoś powodu (przykład: MessagesAppViewControllers mają problemy z zawartością kodu Obj C++), trzymaj się MSMessagesAppViewController.
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-09-29 02:58:10
Jest to odpowiedź akceptowana w Objective-C
[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
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-01-18 13:11:47
Jak na razie z Xcode 8.2, żadne z powyższych rozwiązań nie działa dla mnie.
Odpowiedź @ Dilts działa tylko dla MessageViewController
, która dziedziczy z MSMessagesAppViewController
. Ale kiedy spróbujemy zrobić to samo z naszym Viewcontrollerem, który dziedziczy z UIViewController
, to nie zadziała.
Zrobiłem to, wiążąc górne ograniczenie w odniesieniu do widoku, a nie Top Layout guide. Ustawiłem górne ograniczenie na zero w odniesieniu do widoku i powiązałem to ograniczenie jako topLayout.
@IBOutlet weak var topLayout: NSLayoutConstraint!
A następnie zmień wartość ogranicz programowo zmianę stylu prezentacji.
override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
// Called before the extension transitions to a new presentation style.
if presentationStyle == .compact{
mediaViewController?.topLayout.constant = 0.0
}else{
mediaViewController?.topLayout.constant = 86.0
}
}
Tryb Kompaktowy
Tryb Rozszerzony
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-05-11 13:48:27
[self.view addConstraints: [NSArray arrayWithObjects:
[NSLayoutConstraint constraintWithItem:YourViewHere
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:YourViewHere
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.bottomLayoutGuide
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:YourViewHere
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:[self view]
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:0.0],
[NSLayoutConstraint constraintWithItem:YourViewHere
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:[self view]
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0.0], nil]];
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-06-17 00:04:29