2017-09-27 3 views
5

私はJSQMessageViewControllerの素早い例をiOS 11シミュレータの中で試しました。結果は次のようになります。screenshotjsqmessageviewcontroller ios11ツールバー

セーフエリアマージンを使用してツールバーの制約を修正しようとしましたが、違いはありません。ツールバーがUIWindow(UITextEffectsWindow)の外側にあるようです。解決策はありますか?

+0

申し訳ありませんが、それはあなたがすべてをオーバー達成しようとしているものを、求めているものは非常にはっきりしていませんか? –

+0

スクリーンショットでわかるように、キーボードは、セーフエリアガイドに従うのではなく、iphone Xスティミュレータの下部に配置されています。 –

+0

おそらくJSQのバグです。ご存知のように、その機能は廃止されました。それを置き換える努力はhttps://github.com/MessageKit/MessageKitでやり直しています –

答えて

1

みんな、私はそれを考え出しました! JSQMessagesInputToolbar.mに次のコードを入力するだけです。 inputtoolbarは独自のウィンドウに配置されているようですが、別のウィンドウにアクセスする必要があります。

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

あなたはwindow.safeAreaLayoutGuideをチェックする必要があります。nil cozではありません。上記のコードを使用するとアプリケーションがクラッシュしますが、画面を閉じている間は、 –

1

同じ問題があります。私はJSQMessageViewControllerをセーフエリアを設定したviewControllerの子ビューとして追加して解決しようとしています。

ビーイングMyJSQMessageViewController 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] ]]; 
} 

ない理想的なソリューションが、少なくともあなたはiOS11安全なエリア内で入力ツールバーを持つことになります...は、そのグラフィカルに文句を言わない

enter image description here

+0

入力textviewが最初のレスポンダーになると、collectionViewも少しスクロールされますか? –

+0

私が気づく限り、いいえ。 (もちろん、私はエミュレータでテストしたところです)https://imgur.com/PqLx0Mqの小さなビデオを見ることができます –

3

この回答はJSQMessagesVieに基づいています(画像を参照)、デフォルトのツールバーのようなものwControllerバージョン7.3。

注:以下のコードには、コンパイラの警告を避けるための不気味なプラグマディレクティブが含まれています。プラグマを超えて見えると、コード自体は実際はかなり単純です。

これは、ソフトウェアキーボードが表示されてもツールバーを移動させながら問題を解決しているようです。私は私のJSQMessagesViewControllerサブクラスに次のコードを追加しました:

- (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; 
} 

編集:

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

編集:コードをスウィフトユーザーの場合は、次のトリックは、あなたがプライベートにObjCメソッドを呼び出すせてくださいこの新しい制約が追加された後に、collectionViewのcontentInsetが調整されないため、チャット・ビューに画面に収まるより多くのメッセージが含まれている場合、最後のメッセージ・バブルは入力ツールバーによって隠されます。私は viewDidAppear viewDidLayoutSubviewsに次のコードを追加することによって更新されているインセットを確保することによって、これを解決:

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

私はあなたの 'toolbarBottomLayoutGuide'をどこから取得するのか分かりません。 – Tulleb

+0

toolbarBottomLayoutGuideはJSQMessagesViewControllerで定義されています。私はサブクラス化している。これは.mファイルで定義されているので、私の実装では表示されません。そのため、performSelectorを使用しプラグマディレクティブを追加しています。 –

+0

私たちは別の枝について話していると思います。私はJSQからの最新の '開発'コミットに取り組んでいます。 [それ以来削除されているようです](https://imgur.com/Cj8q6sk) – Tulleb

1

は、私は、最新のdevelopブランチがコミットJSQに基づいて固定フォークを提案しています。

didMoveToWindowソリューションを使用しています。理想的ではありませんが、inputAccessoryViewの安全領域レイアウトガイドの添付ファイル、または他のより良い修正に関するアップルの回答を待つ間に試してみる価値はありません。

あなたは以前JSQラインを置き換える、あなたのPodfileにこれを追加することができます。

pod 'JSQMessagesViewController', :git => 'https://github.com/Tulleb/JSQMessagesViewController.git', :branch => 'develop', :inhibit_warnings => true 
関連する問題