UIPopoverPresentationControllerにビューを表示してポップオーバーとして表示しているとき
popoverCon?.modalPresentationStyle = UIModalPresentationStyle.popover
コンテンツが上に移動し、一部が矢印に表示されています。
さらに、私はポップオーバーの周りに境界がありました
popoverCon?.view.layer.borderColor = .orange
popoverCon?.view.layer.borderWidth = 1.0;
popoverCon?.view.layer.cornerRadius = 10.0;
popoverCon?.view.layer.masksToBounds = false;
矢印のある部分には向いていませんが、矢印の先に少し境界線が表示されています。
これはiOS 12までは問題なく機能していましたが、iOS 13ではこの問題が発生します。
これを解決する方法について何か提案はありますか?
TableViewコンテンツの上部が矢印で切り取られました。これは私の場合にそれを修正する方法です(私のtableViewController Swiftファイルに挿入されたコード):
override func viewSafeAreaInsetsDidChange() {
if #available(iOS 11.0, *) {
super.viewSafeAreaInsetsDidChange()
self.tableView.contentInset = UIEdgeInsets(top: self.tableView.safeAreaInsets.top, left: 0, bottom: 0, right: 0)
}
}
これは間違いなく機能であり、実際にはiOS 11以降の安全な領域を使用してほしいと思っていますが、今は強制的に使用したいようです。
あなたと同じ問題がありましたが、これは私にとってうまくいきました https://useyourloaf.com/blog/safe-area-layout-guide/
Obj-cソリューションが必要な人のための、Obj-Cでの私のソリューション。
以前はpopovercontrollerしかなかったので、質問に示されているようなエラーが発生していました。わかりやすくするために、名前をchildControllerに変更し、@ SaintMSentによって与えられたソリューションが、もともと1つのビューのみの状況で機能するように、包含popoverControllerを作成しました。 https://stackoverflow.com/a/47076040/2148757 ソリューションと https://useyourloaf.com/blog/self-sizing-child-views/ も使用すべてのchildControllersが優先コンテンツサイズを頻繁に設定するため、適切にサイズ変更します。
//Create container popover controller and add child to it
UIViewController* popoverController = [[MyParentPopoverController alloc] init];
[popoverController.view addSubview:childController.view];
[popoverController addChildViewController:childController];
[popoverController setPreferredContentSize:childController.preferredContentSize];
//set popover settings on container
popoverController.modalPresentationStyle = UIModalPresentationPopover;
popoverController.popoverPresentationController.sourceRect = sourceRect;
popoverController.popoverPresentationController.sourceView = buttonView;
popoverController.popoverPresentationController.permittedArrowDirections = direction;
//Fix ios13 'bug' that Apple claims is a feature
UILayoutGuide* guide = popoverController.view.safeAreaLayoutGuide;
childController.view.translatesAutoresizingMaskIntoConstraints = NO;
[childController.view.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
[childController.view.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
[childController.view.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
[childController.view.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
[popoverController.view layoutIfNeeded];
//Show the popover
@interface MyParentPopoverController : UIViewController
@end
@implementation MyParentPopoverController
-(void)preferredContentSizeDidChangeForChildContentContainer:(id <UIContentContainer>)container {
[super preferredContentSizeDidChangeForChildContentContainer:container];
[self setPreferredContentSize:container.preferredContentSize];
}
@end
注:ユーザーベースは使用しないように制限されているため、ios11の互換性を確認しませんでした。
制約を使用する必要があります。また、topAnchorにも注目してください。 safeAreaLayoutGuide.topAnchorである必要があります。私の場合、それは正しく動作します。例えば:
[NSLayoutConstraint activateConstraints:@[
[toolbar.leftAnchor constraintEqualToAnchor:self.view.leftAnchor],
[toolbar.rightAnchor constraintEqualToAnchor:self.view.rightAnchor],
[toolbar.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[toolbar.heightAnchor constraintEqualToConstant:50]
]];
まだ「答え」はありませんが、何が起こっているのか、なぜ修正が難しいのかを特定しました。
ios13 UIPopoverViewControllerがUITableViewControllerを表示-安全領域の問題/テーブルの一部が欠落している
基本的に、ヘッダーまたはフッターを持つUITableViewは、_UITableViewHeaderFooterViewBackground
を変更する方法がない限り、iOS 13では壊れます。
これは悪名高い問題であり、自動レイアウトではうまく機能しません。これは何年も前から知られていましたが、Appleは修正したことがないか、扱いやすくなり、より広く知られるようになりました。
https://spin.atomicobject.com/2016/10/12/auto-layout-uitableview/
これを並べ替えるまで、アプリをApp Storeにプッシュできません。このビューを操作して、AutoLayoutでテーブルの境界を無理に押し出して、この安全な領域への侵入を防ぐ方法を誰かが特定できることを願っています。
間違いなくバグ。 UIPopoverArrowDirectionAnyを使用する状況では、矢印がポップオーバーの上部または左側にある場合にのみ問題が発生し、矢印がポップオーバーの右側または下部に表示される場合には発生しないことがわかります。コードで調整を行って補正する場合、UIPopoverArrowDirectionUpまたはUIPopoverArrowDirectionLeftを使用すると機能しますが、UIPopoverArrowDirectionAnyを使用しているときにその調整を使用すると正しく表示されず、ポップアップがターゲットの四角形の上または右側に表示されます。
インターネットで検索すると、次のリンクから助けを得ました
安全なエリアを追加し、それに応じてビューを管理する必要がありました
CGFloat topPadding = 0.0;
if (@available(iOS 11.0, *)) {
topPadding = self.view.safeAreaLayoutGuide.layoutFrame.Origin.y;
}
迅速:
var topPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
topPadding = self.view.safeAreaLayoutGuide.layoutFrame.Origin.y
}
しかし、私はまだ国境問題を解決できていません。
編集:一時的に、ポップオーバーで非表示のビューを作成し、安全な領域と同じフレームを与えて境界を描画することにより、境界の問題を解決しました。