それで、私は同様の問題を抱えていました。他の人が恩恵を受ける可能性がある場合に備えて、私はstackoverflowから多くの恩恵を受けているので、それを共有すると考えました.
このソリューションを使用すると、カスタマイズ可能なポップオーバー セグエのアンカーを設定できます。また、セグエをモーダルにするかどうかを構成することもできます (外部コンテキストを薄暗くすることでセグエを防ぐ方法が見つからなかったので、誰かがその方法を知っていれば、聞いてみたいと思います)。これは、ポップオーバー コントローラーのパススルー ビューを設定することによって実現されます。また、ソース ビュー コントローラーのビューではなく、カスタム ビューを指定するための容量も追加しました (この容量が必要だったため)。この部分はソリューションにとって重要ではありません。
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
次に、ストーリーボードでセグエを「カスタム」に設定し、セグエ クラスを「DynamicPopoverSegue」に設定します。私の場合、ビュー内の動的レイヤーに関連付けたかったため、アンカーを設定できなかったため、ビューコントローラーの下のバーにあるビューコントローラーアイコンからビューコントローラーへのコントロールクリックでセグエを作成しましたpopupover を表示するために使用します。
ポップオーバー セグエを呼び出すには:
[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self];
ポップオーバー セグエを設定するには:
- (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;
}
}