web-dev-qa-db-ja.com

iOS 10 iMessageアプリ拡張:余分な高さのナビゲーションバーの高さを計算する方法

Xcode 8ベータ版をダウンロードして、iMessagesアプリ拡張SDKで遊んでみましたが、一見標準的ではないナビゲーションバーの高さに問題が発生しました

アプリの拡張ビューに移行すると、次のフレームCGRect(x: 0, y: 0, width: 100, height: 100)の画像がナビゲーションバーの後ろに部分的に非表示になります。ナビゲーションバーの下に表示されます。

私は試した self.navigationController?.navigationBar.isTranslucent = falseしかし、それは機能しませんでした。これは、私のアプリの制御範囲外であるため、理にかなっていると思います。

誰かがこれでまだ遊んでいますか?私は2つのことを避けたいです。適切な高さを推測し、プログラムによるソリューションから離れるだけです。 compactexpanded 助けてくれてありがとう

21
stanley

次のように、上部のレイアウトガイドに制約を設定すると役立つ場合があります。

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
15
Jeremy Kelleher

あなたが私のようで、それでもAuto Layoutが使いにくい場合は、viewDidLayoutSubviewsメソッドを使用してビューサイズを自動的に調整できます。私はあなたと同じ問題のテーブルビューを持っているので、この簡単な方法を使用して、テーブルビューの上面のコンテンツインセットを変更しました。

-(void)viewDidLayoutSubviews {
    [self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}

これまでのところ、すべてのiDeviceで(縦向きと横向きの両方で)正常に動作します。

4
Supertecnoboff

高さは、コントローラーのレイアウトガイドから取得できます。

self.topLayoutGuide.length

@Diltsのデモが機能する理由は、ラベルの上部が上部レイアウトガイドの制約であるためです。それらがスーパービューに対する制約である場合、それはバーの後ろにも行きます。

4
crab oz

上部レイアウトガイドを上部制約として設定すると、MSMessagesAppViewControllerで機能します。ただし、レイアウトガイドが異なるため、UIViewControllersでは機能しません。

何らかの理由でUIViewControllerクラスを本当に使用する必要がない限り(例:MessagesAppViewControllersにObj C++コードを含めるのに問題がある)、MSMessagesAppViewControllerを使用します。

1
Totoro

Xcode 8.2の現在のところ、上記のソリューションはどれも私には機能しません。 @Diltsの回答は、MessageViewControllerを継承するMSMessagesAppViewControllerに対してのみ機能します。しかし、UIViewControllerから継承するViewControllerで同じことを行おうとすると、これは機能しません。

これを行うには、トップレイアウトガイドではなく、ビューに関してトップコンストレイントをバインドします。その制約を表示してtopLayoutとしてバインドすることに関して、top制約をゼロに設定しました。

@IBOutlet weak var topLayout: NSLayoutConstraint!

そして、表示スタイルの変更時にプログラムで制約の値を変更します。

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
        }

    }

enter image description here

コンパクトモード

enter image description here

拡張モード

enter image description here

0
technerd

これはObjective-Cで受け入れられた回答です

[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
0
Josip B.
    [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
danchik