Es gibt keine offizielle Möglichkeit, dies zu tun, aber Sie das gewünschte Verhalten durch eine benutzerdefinierte Ansicht zu schreiben, die einen Verweis oder delegieren hält bekommen können mit seinen Presenting-View-Controller zu interagieren und sie zu der Ansicht Hierarchie hinzufügen. Um das modale Gefühl wirklich zu erhalten, können Sie auch eine transparente Überlagerung über den präsentierenden Controller direkt unterhalb Ihrer 'modalen' Ansicht platzieren. Ich habe dies in einer Reihe von Apps getan und es funktioniert normalerweise großartig. Sie müssen wahrscheinlich die benutzerdefinierte Überlagerungsansicht erstellen, um Berührungen abzufangen und die Präsentation eleganter zu animieren.
Mein transparentes Overlay ist in der Regel etwas wie folgt aus:
@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;
Meine benutzerdefinierte modale Ansicht ist in der Regel etwas wie folgt aus:
@protocol ModalViewDelegate <NSObject>
- (void)performSelectorOnDelegate:(SEL)selector;
@end
@interface ModalView : UIView {
id<ModalViewDelegate> _delegate;
}
@property(nonatomic, assign) id<ModalViewDelegate> delegate;
In meinem Presenting-View-Controller würde ich in der Regel folgendes tun:
- (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];
}
Die Delegaten für die beiden Klassen definiert gibt mir ziemlich viel offenen Zugang, um meinen präsentierenden Controller sowie meine Präsentation und Entlassung wie gewünscht zu manipulieren. Der einzige Nachteil besteht darin, dass es in einer Ansicht mit einer Navigationsleiste verwendet wird, da die Grenzen der Darstellung des präsentierenden Controllers die Grenzen der Navigationsleiste nicht für die Interaktion offen lassen, es gibt Möglichkeiten, dies zu umgehen, aber nicht von ihnen sind sehr hübsch (das Hinzufügen zur Ansicht des Navigationscontrollers ist eine Option).
Mit presentPopoverFromRect können Sie ein Popover anzeigen, wo immer Sie wollen, und es sogar modal verhalten lassen, aber nur den Nachteil, dass der Pfeil nicht versteckt werden kann. – Anna