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)