所以,我有一个类似的问题,如果其他人可能受益,我想我会分享它,因为我从 stackoverflow 中受益匪浅。
此解决方案允许您设置可自定义的弹出框 segue 的锚点。它还允许您将 segue 配置为模态或非模态(我找不到通过调暗外部上下文来防止 segue 的方法,所以如果有人知道如何做到这一点,我会有兴趣听到它);这是通过设置弹出框控制器的直通视图来完成的。我还添加了指定自定义视图的能力,而不是源视图控制器的视图(因为我需要这个能力);这部分对解决方案并不重要。
DynamicPopoverSegue.h
@interface DynamicPopoverSegue : UIStoryboardPopoverSegue
@property BOOL isModal;
@property UIView* sourceView;
@property CGRect anchor;
@end
DynamicPopoverSegue.m
@implementation DynamicPopoverSegue
- (void)perform
{
if (!self.popoverController.popoverVisible)
{
UIViewController* dst = (UIViewController*)self.destinationViewController;
UIViewController* src = (UIViewController*)self.sourceViewController;
UIView* inView = _sourceView ? _sourceView : src.view;
self.popoverController.contentViewController = dst;
if (!_isModal)
{
[self.popoverController setPassthroughViews:[[NSArray alloc] initWithObjects:inView, nil]];
}
[self.popoverController presentPopoverFromRect:_anchor
inView:inView
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
}
@end
然后,您只需在情节提要中将 segue 设置为“Custom”,并将 segue 类设置为“DynamicPopoverSegue”。在我的例子中,因为我想将它与视图中的动态层相关联,所以我无法设置锚点,所以我通过控制点击视图控制器下方栏中的视图控制器图标到我所在的视图控制器来创建 segue用于呈现弹出框。
要调用 popover segue:
[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self];
并配置弹出框segue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"MyPopoverSegue"])
{
DynamicPopoverSegue* popoverSegue = (DynamicPopoverSegue*)segue;
// set the anchor to wherever you want it to be
popoverSegue.anchor = _destinationFrame;
}
}