Xcode 8ベータ版をダウンロードして、iMessagesアプリ拡張SDKで遊んでみましたが、一見標準的ではないナビゲーションバーの高さに問題が発生しました
アプリの拡張ビューに移行すると、次のフレームCGRect(x: 0, y: 0, width: 100, height: 100)
の画像がナビゲーションバーの後ろに部分的に非表示になります。ナビゲーションバーの下に表示されます。
私は試した self.navigationController?.navigationBar.isTranslucent = false
しかし、それは機能しませんでした。これは、私のアプリの制御範囲外であるため、理にかなっていると思います。
誰かがこれでまだ遊んでいますか?私は2つのことを避けたいです。適切な高さを推測し、プログラムによるソリューションから離れるだけです。 助けてくれてありがとう
次のように、上部のレイアウトガイドに制約を設定すると役立つ場合があります。
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
あなたが私のようで、それでもAuto Layout
が使いにくい場合は、viewDidLayoutSubviews
メソッドを使用してビューサイズを自動的に調整できます。私はあなたと同じ問題のテーブルビューを持っているので、この簡単な方法を使用して、テーブルビューの上面のコンテンツインセットを変更しました。
-(void)viewDidLayoutSubviews {
[self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}
これまでのところ、すべてのiDeviceで(縦向きと横向きの両方で)正常に動作します。
高さは、コントローラーのレイアウトガイドから取得できます。
self.topLayoutGuide.length
@Diltsのデモが機能する理由は、ラベルの上部が上部レイアウトガイドの制約であるためです。それらがスーパービューに対する制約である場合、それはバーの後ろにも行きます。
上部レイアウトガイドを上部制約として設定すると、MSMessagesAppViewControllerで機能します。ただし、レイアウトガイドが異なるため、UIViewControllersでは機能しません。
何らかの理由でUIViewControllerクラスを本当に使用する必要がない限り(例:MessagesAppViewControllersにObj C++コードを含めるのに問題がある)、MSMessagesAppViewControllerを使用します。
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
}
}
コンパクトモード
拡張モード
これはObjective-Cで受け入れられた回答です
[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
[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]];