我尝试使用旧的(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];
}
}