Официального способа сделать это не существует, однако вы можете получить желаемое поведение, написав пользовательское представление, в котором хранится ссылка или делегат для взаимодействия с представляемым контроллером представления и добавляя его в иерархию представления.Чтобы по-настоящему почувствовать модальность, вы также можете разместить прозрачный оверлей над контроллером представления чуть ниже вашего «модального» вида.Я сделал это во многих приложениях, и это обычно работает отлично.Скорее всего, вам потребуется создать пользовательский вид наложения, чтобы вы могли перехватывать прикосновения и более элегантно анимировать его презентацию.
Мое прозрачное наложение обычно выглядит примерно так:
@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, оставляя его открытым для взаимодействия, есть способы обойти это, но не ихочень красивые (добавление к представлению контроллера навигации является одним из вариантов).