设置 UIViewController preferredContentSize 在 iOS 17 中不起作用

Setting UIViewController preferredContentSize not working in iOS 17

提问人:Silverness 提问时间:11/7/2023 最后编辑:Silverness 更新时间:11/17/2023 访问量:54

问:

在 iOS 17 中,我遇到了一个问题,即 UIPopoverPresentationControllers 没有保留它们所包含的 UIViewController 的首选大小。

以下方法使用 UIPopoverPresentationController 显示来自 UIView 定位点位置的 UIViewController。popoverVCcontentVCviewframe

+ (void) showDialogiPad:(UIViewController *)contentVC
       fromPresentingVC:(UIViewController *)presentingVC
                 inView:(UIView *)view
                atFrame:(CGRect)frame
          withDirection:(UIPopoverArrowDirection)direction {
    
    // Set content view controller size
    contentVC.preferredContentSize = contentVC.view.frame.size; // size should be 320x480
        
    // Choose the presentation style in which the content is
    // displayed in a popover view
    contentVC.modalPresentationStyle = UIModalPresentationPopover;
    
    // Set the popover size and anchor location
    contentVC.popoverPresentationController.sourceRect = frame;
    contentVC.popoverPresentationController.sourceView = view;
    
    // Present the popover presentation controller
    [presentingVC presentViewController:contentVC animated:YES completion:nil];
}

的大小在其方法中设置如下:contentVCviewDidLoad

- (void)viewDidLoad {
    
    [super viewDidLoad];

    // Set the size of this view controller (which is used in a popup view controller)
    self.view.frame = CGRectMake(0, 0, 320, 480);
    
    // Set a border around the view
    CALayer *layer = self.view.layer;
    layer.borderColor = [[UIColor darkGrayColor] CGColor];
    layer.borderWidth = 2;
    layer.cornerRadius = 10;
}

在 iOS 17 之前,代码按预期显示弹出框,如下所示:

enter image description here

然而,现在,自从更新到 iOS 17 以来,弹出框现在被压缩并显示为:

enter image description here

几点观察:

  • 弹出框对话框实际上在您第一次打开时会正确显示。每次打开它时,它都会被压扁。
  • 当我注释掉设置 的行时,弹出框每次都以最大大小打开 - 因此它显示所有内容,但未设置为我想要的大小。preferredContentSize
  • 如果我保持原样但更改为 ,则弹出框的大小是正确的,但弹出框始终显示在屏幕中间。preferredContentSizemodalPresentationStyleUIModalPresentationFormSheet
iOS UIViein控制器 iOS17

评论


答:

1赞 HangarRash 11/7/2023 #1

我发现,在许多情况下,如果给定的视图控制器覆盖该属性,而不是在外部将视图控制器的属性设置为某个值,效果会更好。这样做的好处是将首选大小的知识放在视图控制器本身中。preferredContentSizepreferredContentSize

- (CGSize)preferredContentSize {
    return CGSizeMake(width: 320, height: 480);
}