2017-09-27 4 views
5

Ich habe das schnelle Beispiel von JSQMessageViewController in iOS 11 Simulator versucht. Hier ist das Ergebnis: screenshotjsqmessageviewcontroller ios11 toolbar

Ich habe versucht, Safe Area Margin verwenden und ändern Sie die Symbolleistenbeschränkung, aber es gibt immer noch keinen Unterschied. Es scheint, dass die Symbolleiste außerhalb von UIWindow (stattdessen UITextEffectsWindow) liegt. Gibt es eine Lösung?

+0

Sorry, aber es ist nicht ganz klar, was Sie fragen, was Sie alles zu erreichen über versuchen? –

+0

Wie Sie auf dem Screenshot sehen können, befindet sich die Tastatur am unteren Rand des iPhone X-Stimulators, anstatt dem Sicherheitsbereich zu folgen. –

+0

Wahrscheinlich ein Bug mit JSQ. Wie Sie vielleicht wissen, ist es veraltet. Ein Versuch, es zu ersetzen, geht über https://github.com/MessageKit/MessageKit weiter. –

Antwort

1

Jungs Ich habe es herausgefunden! Fügen Sie einfach den folgenden Code in JSQMessagesInputToolbar.m ein. Es scheint, dass die inputtoolbar in einem eigenen Fenster platziert ist, Sie müssen separat auf ihr Fenster zugreifen.

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

Sie müssen überprüfen Sie über window.safeAreaLayoutGuide nicht nil coz verwenden Sie einfach oben Code App stürzt ab, während der Bildschirm schließen, so fügen Sie wenn Bedingung, die überprüfen kann, ob nil dann überspringen –

1

Ich habe das gleiche Problem. Ich versuche, es zu lösen, indem ich den JSQMessageViewController als eine untergeordnete Ansicht auf einem ViewController hinzufüge, der sicheren Bereich eingerichtet hat.

Being MyJSQMessageViewController eine Unterklasse von 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] ]]; 
} 

Nicht ideale Lösung, aber zumindest werden Sie Eingabeleiste innerhalb iOS11 sicheren Bereich haben ... Schlechte Nachricht ist, dass die Eingabe-Symbolleiste wird nicht auf nicht sicheren Bereichen angezeigt werden so grafisch sein pflegt wie eine Standard-Symbolleiste (siehe Bild)

enter image description here

+0

Machen Sie Ihre SammlungView auch ein wenig gescrollt, wenn die Eingabe Textview wird der erste Responder? –

+0

Nein, soweit ich es merken kann. (natürlich habe ich gerade auf Emulator getestet) Sie können kleine Video auf https://imgur.com/PqLx0Mq –

3

Diese Antwort basiert auf JSQMessagesVie wController Version 7.3.

Hinweis: Der folgende Code enthält einige unsaubere Pragma-Anweisungen, um Compiler-Warnungen zu vermeiden. Der Code selbst ist eigentlich ganz einfach, wenn man über die Pragmas hinausgeht.

Dies scheint das Problem zu lösen, während die Symbolleiste weiterhin verschoben werden kann, wenn die Softwaretastatur angezeigt wird. Ich habe den folgenden Code in meiner JSQMessagesViewController Unterklasse:

- (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: Für Swift Benutzer sollte die folgenden Trick können Sie die private objc Methode aufrufen:

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

Edit: Der Code Dadurch wird das contentInset der collectionView nicht aufgerufen, nachdem diese neue Einschränkung hinzugefügt wurde. Wenn die Chat-Ansicht mehr Nachrichten enthält, als auf den Bildschirm passen, wird die letzte Nachrichtenblase von der Eingabe-Toolbar verdeckt. Ich löste dies durch die Einsätze zu gewährleisten, indem Sie die folgenden Code in aktualisiert werden viewDidAppear viewDidLayoutSubviews:

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

Ich verstehe nicht, wo Sie Ihre 'toolbarBottomLayoutGuide' aus ... – Tulleb

+0

toolbarBottomLayoutGuide ist in JSQMessagesViewController, die definiert Ich untergliedere mich. Es ist in der .m-Datei definiert, so dass es für meine Implementierung nicht sichtbar ist, weshalb ich performSelector verwende und die Pragma-Direktiven hinzufüge. –

+0

Ich denke, wir sprechen dann von verschiedenen Branchen. Ich arbeite an dem neuesten 'develop' Commit von JSQ. [Es sieht so aus, als ob es seither entfernt wurde.] (Https://imgur.com/Cj8q6sk) – Tulleb

1

Ich schlage eine feste Gabel auf der Grundlage der neuesten JSQ develop Zweig begehen.

Es wird die didMoveToWindow Lösung verwendet. Nicht ideal, aber es lohnt sich, es zu versuchen, während Sie auf die Antwort von Apple über den sicheren Bereichsplanungsanleitung inputAccessoryView oder irgendeine andere bessere Reparatur warten.

Sie können diese zu Ihrem Podfile hinzufügen, die vorherige JSQ Linie ersetzt:

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