为什么 UIPopoverPresentationController 调整其内容视图的大小?

ske*_*ell 5 objective-c popover uipopovercontroller ios

我尝试过使用旧的(iOS 7)和新的(iOS 8)方式在弹出窗口中呈现视图控制器,但是当我的 VC 在弹出窗口中呈现时,它的侧面有一些额外的空间,因为它的框架大小被设置为宽 13 点。为什么?

更多细节

它在 iOS7 模拟器中看起来很好(当用旧方式编写时)。

我意识到 13 pt 可能是箭头的大小(当您强制箭头向上或向下时,它会将 13 pt 添加到高度而不是宽度)。

我做了一些进一步的检查(通过在我的视图中设置断点setFrame:),发现有一个UIPopoverPresentationController方法presentationTransitionWillBegin调用了setFrame:错误的框架。阅读UIPopoverPresentationController 类参考后,我了解到该类的实例是UIKit在呈现弹出窗口时创建和管理的。那么,UIKit你为什么要尝试调整我的视图大小以包含箭头?

以供参考

通过“旧方式”,我的意思是我重写contentSizeForViewInPopover正在呈现的视图控制器的方法,然后将其呈现

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:aViewController];
[self.popoverController presentPopoverFromRect:rect
                                        inView:anInView
                      permittedArrowDirections:popoverArrowDirection
                                      animated:animated];
Run Code Online (Sandbox Code Playgroud)

我所说的“新方式”是指

viewController.preferredContentSize = CGSizeMake(50.0f, 50.0f);
viewController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:viewController animated:YES completion:nil];

UIPopoverPresentationController *presentationController = [viewController popoverPresentationController];
presentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight;
presentationController.sourceView = aSourceView;
presentationController.sourceRect = aFrame;
Run Code Online (Sandbox Code Playgroud)

我目前的解决方法

我不允许我的视图被UIPopoverPresentationController或任何控制器调整大小。

@interface FixedSizeView : UIView
@end

@implementation FixedSizeView {
    CGSize size;
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        size = frame.size;
    }
    return self;
}

- (void)setFrame:(CGRect)frame {
    if (CGSizeEqualToSize(size, frame.size) || CGSizeEqualToSize(CGSizeZero,size)) {
        [super setFrame:frame];
    }
}
Run Code Online (Sandbox Code Playgroud)