2017-09-27 34 views
5

Próbowałem szybki przykład JSQMessageViewController wewnątrz symulatora iOS 11. Oto wynik: screenshotjsqmessageviewcontroller Pasek narzędziowy ios11

Próbowałem użyć marginesu obszaru bezpiecznego i zmodyfikować ograniczenie paska narzędzi, ale nadal nie ma różnicy. Wygląda na to, że pasek narzędzi znajduje się poza UIWindow (zamiast tego UITextEffectsWindow). Czy istnieje jakieś rozwiązanie?

+0

Niestety ale to nie jest bardzo jasne, o co pytasz, co starasz się osiągnąć ponad wszystko? –

+0

Jak widać na zrzucie ekranu, klawiatura znajduje się na spodzie stymulatora iphone X, zamiast podążać za przewodnikiem po obszarze bezpiecznym. –

+0

Prawdopodobnie błąd z JSQ. Jak pewnie wiesz, został przestarzały. Próbuje go zastąpić na https://github.com/MessageKit/MessageKit –

Odpowiedz

1

Chłopaki mam zorientowaliśmy się! Wystarczy umieścić następujący kod w JSQMessagesInputToolbar.m. Wygląda na to, że inputtoolbar znajduje się w osobnym oknie, musisz uzyskać dostęp do jego okna osobno.

-(void) didMoveToWindow{ 
[super didMoveToWindow]; 
if (@available(iOS 11.0, *)) { 
    [[self bottomAnchor] constraintLessThanOrEqualToSystemSpacingBelowAnchor:self.window.safeAreaLayoutGuide.bottomAnchor multiplier:1.0].active = YES; 
    } 
} 
+1

musisz sprawdzić o window.safeAreaLayoutGuide not nil coz po prostu użyj powyższej aplikacji aplikacji do kodu podczas zamykania ekranu, dodaj więc czy warunek, który można sprawdzić czy zero, to pomiń –

1

Mam podobny problem. Próbuję go rozwiązać, dodając JSQMessageViewController jako widok podrzędny na kontrolerze viewController, który ma skonfigurowany bezpieczny obszar.

Być MyJSQMessageViewController podklasą JSQMessagesViewController:

self.myJSQMessageViewController = [[MyJSQMessageViewController alloc] init]; 
[self addChildViewController:self.myJSQMessageViewController]; 
[self.view addSubview:self.myJSQMessageViewController.view]; 
[self.myJSQMessageViewController didMoveToParentViewController:self]; 
if (@available(iOS 11.0, *)) { 
    self.myJSQMessageViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
    [NSLayoutConstraint activateConstraints:@[ [self.myJSQMessageViewController.view.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], [self.myJSQMessageViewController.view.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], [self.myJSQMessageViewController.view.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], [self.myJSQMessageViewController.view.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] ]]; 
} 

Nie idealne rozwiązanie, ale przynajmniej będziesz miał pasek wejściowy wewnątrz bezpiecznego obszaru iOS11 ... Zła wiadomość jest taka, że ​​pasek narzędzi wejście wont być wyświetlane na bezpiecznych terenach niebędących tak graficznie jak przyzwyczajenie być domyślnym pasku narzędzi (patrz zdjęcie)

enter image description here

+0

czy twoja kolekcja jest również przewijana nieco w dół, gdy wejściowy widok tekstowy staje się pierwszym respondentem? –

+0

Nie, o ile mogę zauważyć. (oczywiście właśnie testowałem na emulatorze) Możesz zobaczyć małe wideo na https://imgur.com/PqLx0Mq –

3

Ta odpowiedź jest oparta na JSQMessagesVie Wersja wController 7.3.

Uwaga: Poniższy kod zawiera pewne nieuporządkowane dyrektywy, aby uniknąć ostrzeżeń kompilatora. Sam kod jest w rzeczywistości całkiem prosty, gdy zobaczysz poza pragmami.

Wydaje się, że to rozwiązuje problem, jednocześnie umożliwiając przeniesienie paska narzędzi po wyświetleniu klawiatury programowej. I dodaje następujący kod w moim JSQMessagesViewController podklasy:

- (void)viewDidLoad { 
    [...] 

    // To keep the toolbar inside the safe area on iPhone X, we need to install a new constraint that has higher priority than the one 
    // JSQMessagesViewController manipulates when adjusting for the keyboard. The `toolbarBottomLayoutGuide` is a private property in our 
    // superclass, so it's not straightforward to access it... 
    if (@available(iOS 11.0, *)) { 
    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Wundeclared-selector" 
     NSLayoutConstraint *constraint = [self performSelector:@selector(toolbarBottomLayoutGuide)]; 
    #pragma clang diagnostic pop 
     constraint.priority = 999; 
     [self.inputToolbar.bottomAnchor constraintLessThanOrEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor].active = YES; 
} 

Edit: Dla użytkowników Swift następujący trik powinien pozwalają wywołać prywatną metodę objc:

let constraint = perform(Selector(("toolbarBottomLayoutGuide"))).takeUnretainedValue() as! NSLayoutConstraint 
constraint.priority = 999 

Edit: Kod która dostosowuje zawartośćInformacja kolekcji collectionView nie jest wywoływana po dodaniu nowego ograniczenia, więc jeśli widok czatu zawiera więcej wiadomości niż pasuje do ekranu, ostatni dymek jest zasłonięty przez pasek narzędzi wprowadzania. Rozwiązałem to przez zapewnienie wypustki są aktualizowane dodając następujący kod w viewDidAppear viewDidLayoutSubviews:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wundeclared-selector" 
[self performSelector:@selector(jsq_updateCollectionViewInsets)]; 
#pragma clang diagnostic pop 
+0

Nie rozumiem skąd masz swój 'toolbarBottomLayoutGuide' z ... – Tulleb

+0

toolbarBottomLayoutGuide jest zdefiniowany w JSQMessagesViewController, który Podklasuję. Jest zdefiniowany w pliku .m, więc nie jest widoczny dla mojej implementacji, dlatego używam performSelector i dodam dyrektywy pragma. –

+0

Myślę, że wtedy rozmawiamy o różnych gałęziach. Pracuję nad najnowszym 'develop' commit od JSQ. [Wygląda na to, że został usunięty od.] (Https://imgur.com/Cj8q6sk) – Tulleb

1

ja proponuje stałą widelec w oparciu o JSQ najnowszy develop oddział popełnił.

Używa rozwiązania didMoveToWindow. Nie jest to idealne rozwiązanie, ale warto spróbować, czekając na odpowiedź Apple'a na temat załącznika do bezpiecznego rozmieszczania obszarów w wersji inputAccessoryView lub jakiejkolwiek innej lepszej poprawki.

Można dodać do swojej Podfile, zastępując poprzednią linię JSQ:

pod 'JSQMessagesViewController', :git => 'https://github.com/Tulleb/JSQMessagesViewController.git', :branch => 'develop', :inhibit_warnings => true