Ho un controller di visualizzazione (con UIWebView) presente nello stile del foglio di forma. Devo mettere un pulsante "Fine" nella barra degli strumenti UIT della vista nel controller di visualizzazione per farlo scartare. Ma, dal momento che presentarlo nello stile "Modulo" lascia un sacco di spazio inutilizzato al di fuori della vista del View Controller ... Stavo vagando .. C'è un modo per rilevare un tocco al di fuori della vista? in quella zona "ombreggiata"? Grazie in anticipocome ignorare un controller di visualizzazione modale presentato come "Foglio modulo" quando un tocco si verifica all'esterno del foglio modulo?
risposta
Su iOS 4.2, la gerarchia di viste di un'app basata sul controller di navigazione con un foglio di modulo modale è la seguente durante viewWillAppear:
. Una volta visualizzata la vista modale, UITransitionView è stato sostituito da UIDropShadowView che contiene la gerarchia della vista modale.
UIWindow
UILayoutContainerView (regular hierarchy)
UIDimmingView
UITransitionView
di Apple avvisate contro basandosi sulle subviews di costruito in vista, in quanto questi sono considerati privati e possono cambiare nelle versioni future. Questo potrebbe potenzialmente rompere la tua app.
Approccio 1
Possiamo inserire una visione trasparente tra le ultime due subviews di finestra, e lo hanno rispondere a toccare gli eventi respingendo il modulo modale.
Questa implementazione controlla che la gerarchia della vista della finestra sia come previsto e silenziosamente non farà nulla se non.
Creare e utilizzare DismissingView
da viewWillAppear:
nel controller della vista modale.
DismissingView *dismiss = [[DismissingView alloc] initWithFrame:window.frame
selector:@selector(dismissView:) target:self];
[dismiss addToWindow:window];
[dismiss release];
E l'implementazione.
@interface DismissingView : UIView {
}
@property (nonatomic, retain) id target;
@property (nonatomic) SEL selector;
- (id) initWithFrame:(CGRect)frame target:(id)target selector:(SEL)selector;
@end
@implementation DismissingView
@synthesize target;
@synthesize selector;
- (id) initWithFrame:(CGRect)frame target:(id)target selector:(SEL)selector
{
self = [super initWithFrame:frame];
self.opaque = NO;
self.backgroundColor = [UIColor clearColor];
self.selector = selector;
self.target = target;
return self;
}
- (void) addToWindow:(UIWindow*)window
{
NSUInteger count = window.subviews.count;
id v = [window.subviews objectAtIndex:count - 1];
if (![@"UITransitionView" isEqual:NSStringFromClass([v class])]) return;
v = [window.subviews objectAtIndex:count - 2];
if (![@"UIDimmingView" isEqual:NSStringFromClass([v class])]) return;
UIView *front = [window.subviews lastObject];
[window addSubview:self];
[window bringSubviewToFront:front];
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[self removeFromSuperview];
[target performSelector:selector withObject:self];
}
@end
Approccio 2
Il primo approccio è preferito, poiché questo ha logica aggiuntiva per ogni evento tocco sul modulo modale.
Aggiungere la vista trasparente come vista frontale della finestra. Gli eventi di tocco all'interno del frame della vista modale vengono passati ad esso, mentre quelli esterni al riquadro ignorano il modulo modale.
Prima che compaia, la gerarchia della vista modale appare così. Quando appare, UIDropShadowView sostituisce UITransitionView nelle sottoview della finestra. L'UILayoutContainerView
UIDropShadowView
UIImageView
UILayoutContainerView
UINavigationTransitionView
UIViewControllerWrapperView
UIView (the modal view)
UINavigationBar
L'implementazione è quasi lo stesso di prima, con una nuova proprietà e addToWindow:
sostituito da addToWindow:modalView:
.
DismissingView può ancora essere aggiunto alla finestra in viewWillAppear:
, poiché UIDropShadowView sostituisce UITransitionView.
Ancora una volta non facciamo nulla se la gerarchia della vista non è come previsto.
@property (nonatomic, retain) UIView *view;
- (void) addToWindow:(UIWindow*)window modalView:(UIView*)v
{
while (![@"UILayoutContainerView" isEqual:NSStringFromClass([v class])]) {
v = v.superview;
if (!v) {
return;
}
}
self.view = v;
[window addSubview:self];
}
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
CGPoint p = [self convertPoint:point toView:view];
UIView *v = [view hitTest:p withEvent:event];
return v ? v : [super hitTest:point withEvent:event];
}
Penso che la risposta giusta è: "non farlo"
- 1. Come modificare la posizione di un foglio di modulo Controller vista modale
- 2. OS-X: Come impedire il ridimensionamento di un controller di visualizzazione presentato come foglio
- 3. Come caricare un foglio specifico da un foglio di calcolo
- 4. ios: come eliminare un controller di visualizzazione modale e quindi inserire un controller di visualizzazione spinto
- 5. Come CenterParent un modulo non modale
- 6. Come utilizzare un UISplitViewController come controller di visualizzazione modale?
- 7. Un controller di visualizzazione presentato può anche essere un controller di visualizzazione presentante?
- 8. Come si chiude un modulo modale subito dopo averlo aperto?
- 9. Come si crea un modulo modale in Windows Form?
- 10. Avviso su due controller di navigazione presentato come modale
- 11. iPhone - Rimozione di un controller di visualizzazione presentato
- 12. come copiare un foglio di un foglio di lavoro su un altro foglio di lavoro utilizzando POI apache e java
- 13. Come caricare un altro controller di visualizzazione dal file di implementazione del controller di visualizzazione corrente?
- 14. Come mostrare un NSPanel come foglio
- 15. iOS8 impossibile ridimensionare il foglio modulo modale dopo aver cambiato l'orientamento
- 16. Come posso creare un UIViewController modale traslucido?
- 17. Come ottenere l'ID del foglio di lavoro da un foglio di calcolo di Google con python?
- 18. Come modificare il nome del foglio da C# su un foglio di calcolo Excel
- 19. Congeda modale vista foglio di modulo a iOS rubinetto esterno 8
- 20. AngularJS - Come costanti modulo da un controller
- 21. Come ottenere un valore di modulo in un controller
- 22. Presenta un controller di visualizzazione modale con sfondo trasparente
- 23. iOS Unwind Segue smette di funzionare quando incorporato in un controller di navigazione
- 24. Foglio di calcolo Google, copia colonna in foglio in colonna in un altro foglio
- 25. Come eliminare un modal che è stato presentato in un UIStoryboard con un passaggio modale?
- 26. PHPExcel Verifica se il foglio esiste
- 27. Come posso creare un modulo che non è disabilitato quando un altro modulo viene mostrato in modo modale?
- 28. Inserisci il codice Excel-VBA nel modulo o nel foglio?
- 29. Chiudi il controller di visualizzazione modale - Memoria?
- 30. Come eseguire il codice JavaScript quando si ripristina un modulo?
soluzione molto più semplice qui: http: // StackOverflow.it/questions/2623417/iphone-sdk-dismissing-modal-viewcontrollers-on-ipad-by-click-outside-of-it – onekiloparsec
@ Cédric Questa soluzione non è abbastanza buona per il nostro caso d'uso. Aggiungi un popover che si estende oltre i limiti della vista e bam. Questa soluzione si rompe. – Mazyod