これを行う公式の方法はありませんが、参照または委任を保持して現在のビューコントローラと対話し、それをビュー階層に追加するカスタムビューを作成することで、目的の動作を得ることができます。モーダルな感覚を実際に得るには、「モーダル」ビューのすぐ下にある表示コントローラーの上に透明なオーバーレイを配置することもできます。私はこれを多くのアプリで行ってきましたが、通常はうまくいきます。タッチをインターセプトし、そのプレゼンテーションをよりエレガントにアニメーション化できるように、カスタムオーバーレイビューを作成する必要がある可能性があります。
私の透明なオーバーレイは通常次のようなものです:
@protocol TransparentOverlayDelegate <NSObject>
@optional
- (void)transparentOverlayWillDismiss:(TransparentOverlay *)backgroundTouch;
- (void)transparentOverlayDidDismiss:(TransparentOverlay *)backgroundTouch;
@end
@interface TransparentOverlay : UIView {
id<TransparentOverlayDelegate> _delegate;
UIView *_contentView;
CGFloat _pAlpha;
}
@property(nonatomic, assign) id<TransparentOverlayDelegate> delegate;
@property(nonatomic, retain) UIView *contentView;
@property(nonatomic, assign) CGFloat pAlpha;
- (void)presentTransparentOverlayInView:(UIView *)view;
- (void)dismissTransparentOverlay:(BOOL)animated;
私のカスタムモーダルビューは通常、次のようなものです。
@protocol ModalViewDelegate <NSObject>
- (void)performSelectorOnDelegate:(SEL)selector;
@end
@interface ModalView : UIView {
id<ModalViewDelegate> _delegate;
}
@property(nonatomic, assign) id<ModalViewDelegate> delegate;
私のプレゼンテーションビューコントローラーでは、通常、次のことを行います。
- (void)presentModalController {
TransparentOverlay *to = [[[TransparentOverlay alloc] initWithFrame:self.view.bounds] autorelease];
to.delegate = self;
ModalView *mv = [[ModalView alloc] initWithFrame:CGRectMake(500, 500, 300, 300)];
mv.delegate = self;
to.contentView = mv;
[mv release];
[to presentTransparentOverlayInView:self.view];
}
2つのクラスで定義されたデリゲートを使用すると、プレゼンテーションコントローラーを操作したり、必要に応じてプレゼンテーションと解雇を操作したりするためのほぼオープンなアクセスが可能になります。これの唯一の欠点は、NavigationBarのあるビューで使用する場合です。これは、表示するコントローラーのビューの境界にNavigationBarの境界が含まれず、対話用に開いたままになるためです。これを回避する方法はありますが、回避する方法はありません。とてもきれいです(ナビゲーションコントローラーのビューに追加するのは1つのオプションです)。