没有官方方法可以做到这一点,但是您可以通过编写自定义视图来获得所需的行为,该视图保留引用或委托以与其呈现的视图控制器进行交互并将其添加到视图层次结构中。要真正获得模态的感觉,您还可以在“模态”视图下方的呈现控制器上放置一个透明覆盖层。我已经在许多应用程序中做到了这一点,而且通常效果很好。您可能需要制作自定义叠加视图,以便您可以拦截触摸并更优雅地为其演示设置动画。
我的透明覆盖通常是这样的:
@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];
}
使用在这两个类上定义的委托给了我非常开放的访问权限来操作我的演示控制器以及我的演示和解散。唯一的缺点是当它在带有 NavigationBar 的视图上使用时,因为呈现控制器的视图的边界不会包含 NavigationBar 的边界,使其保持打开状态以进行交互,有一些方法可以解决这个问题,但不是其中的一种非常漂亮(添加到导航控制器的视图是一种选择)。