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. Kompaktowy Rozszerzony dzięki za pomoc

Author: stanley, 2016-06-17

8 answers

Może pomóc mieć ograniczenie z przewodnikiem top layout tak:

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
 15
Author: Jeremy Kelleher,
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.

 4
Author: crab oz,
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.

 4
Author: Supertecnoboff,
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":

wysokość paska nawigacyjnego rozszerzenia aplikacji iMessage

86px

UPDATE

O pasku nawigacyjnym ukrywającym Twój UI. Zrobiłem szybkie demo i nie miałem problemów.

Dodano etykiety w pozycji y 20

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.

Wynik

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!

 2
Author: Lucas,
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.

 1
Author: Totoro,
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;
 0
Author: Josip B.,
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
        }

    }

Tutaj wpisz opis obrazka

Tryb Kompaktowy

Tutaj wpisz opis obrazka

Tryb Rozszerzony

Tutaj wpisz opis obrazka

 0
Author: technerd,
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]];
 0
Author: danchik,
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