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

时间:2014-10-03 13:40:35

标签: ios objective-c uipopovercontroller popover

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

更多详情

在iOS7模拟器中显示正常(以旧方式编写)。

我已经意识到13磅可能是箭头的大小(当你强制箭头向上或向下然后它将13磅加到高度而不是宽度上)。

我做了一些进一步的检查(通过在我的视图的setFrame:中设置断点),发现有一个UIPopoverPresentationController方法presentationTransitionWillBegin调用setFrame:糟糕的框架。阅读UIPopoverPresentationController Class Reference后,我了解到当您呈现弹出窗口时,UIKit创建并管理此类的实例。好吧,为什么UIKit你试图调整我的视图以包含箭头?

供参考

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

一起呈现
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:aViewController];
[self.popoverController presentPopoverFromRect:rect
                                        inView:anInView
                      permittedArrowDirections:popoverArrowDirection
                                      animated:animated];

通过“新方式”我的意思是

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;

我目前的解决方法

我不允许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];
    }
}

0 个答案:

没有答案