27

当我在 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 中,这个问题即将到来。

关于如何解决这个问题的任何建议?

4

9 回答 9

9

我的 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)
    }
}
于 2019-09-26T23:35:09.393 回答
7

我在 Obj-C 中的解决方案,适用于需要 obj-c 解决方案的人。

我以前只有 popovercontroller,这会产生问题中显示的错误。为了清楚起见,我将它重命名为 childController 并创建了一个包含 popoverController 以使 @SaintMSent 给出的解决方案在我最初只有一个视图的情况下工作。还使用了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 的兼容性,因为我的用户群被限制不使用它。

于 2019-10-24T20:29:22.713 回答
4

这绝对是一个功能,实际上他们希望您使用 iOS 11 以来的安全区域,但现在他们似乎想强迫您使用它

和你有同样的问题,这对我 有用 https://useyourloaf.com/blog/safe-area-layout-guide/

于 2019-09-27T11:38:13.137 回答
1

我还没有“答案”,但我已经确定了发生了什么以及为什么它如此难以修复。

ios13 UIPopoverViewController 显示 UITableViewController - 安全区域问题/表的缺失部分

基本上,任何具有页眉或页脚的 UITableView 都会在 iOS 13 中被破坏,除非有某种方法可以改变_UITableViewHeaderFooterViewBackground

这是出了名的问题,并且不能很好地与 Auto-Layout 配合使用 - 它已为人所知多年,但 Apple 从未修复它或使其更容易处理和更广为人知。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=video&cd=1&cad=rja&uact=8&ved=0ahUKEwibouuozfvkAhVCXRUIHVGsBegQtwIIKjAA&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DajsCY8SjJ1Y&usg= AOvVaw3_U_jy9EWH2dJrM8p-XhDQ

https://spin.atomicobject.com/2016/10/12/auto-layout-uitableview/

我无法将我的应用程序推送到 App Store,直到我得到这个排序。我希望有人能确定如何操作这个视图,以便它停止使用 AutoLayout 将表格的边界推到不正常的地方,这会导致这个安全区域入侵.

于 2019-10-01T22:43:35.037 回答
1

绝对是一个错误。当您遇到使用 UIPopoverArrowDirectionAny 的情况时,您会看到问题仅在箭头位于弹出框的顶部或左侧时存在,而不是在箭头出现在弹出框的右侧或底部时存在。如果您在代码中进行调整以进行补偿,则如果您使用 UIPopoverArrowDirectionUp 或 UIPopoverArrowDirectionLeft 它将起作用,但在使用 UIPopoverArrowDirectionAny 时使用该调整将无法正确显示,并且弹出窗口出现在目标矩形的上方或右侧。

于 2019-09-24T15:39:15.200 回答
0

Searching on the internet I got help from following link

Twitter

so I had to add safe area and manage my views accordingly

CGFloat topPadding = 0.0;
    if (@available(iOS 11.0, *)) {
         topPadding = self.view.safeAreaLayoutGuide.layoutFrame.origin.y;
    }

Swift:

var topPadding: CGFloat = 0.0
    if #available(iOS 11.0, *) {
        topPadding = self.view.safeAreaLayoutGuide.layoutFrame.origin.y
    }

but I haven't got solution to the border problem of mine yet.

Edit: Temporarily I did solved the border problem by creating an invisible view on popover and giving it same frame as safe area and drawing its border.

于 2019-09-18T09:21:55.787 回答
0

您应该使用约束。并且还要注意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]
    ]];
于 2019-11-25T15:01:35.413 回答
0

将弹出框的内容嵌入另一个视图中,并启用“安全区域相对边距”。这应该有 -21,-21 作为原点。关闭垂直和水平自动调整大小。似乎工作,虽然你失去了自动拉伸。

于 2021-08-02T11:25:22.443 回答
-1

UIViewController像这样设置弹出窗口的内容:

NSLayoutConstraint.activate([
        myContentView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        myContentView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
        myContentView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
        myContentView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor)
    ])
于 2020-09-29T16:39:39.687 回答