Mam kontroler widoku (z interfejsem UIWebView) prezentuję w stylu arkusza formularza. Muszę umieścić przycisk "Gotowe" w pasku UIToolbar widoku w Kontroli widoku, aby go zwolnić. Ale, ponieważ prezentowanie go w stylu "Formularza arkusza" pozostawia mnóstwo niewykorzystanej przestrzeni poza widokiem kontrolera widoku ... Błąkałem się. Czy istnieje sposób wykrywania dotyku poza widokiem? w tym "wyszarzonym" obszarze? Z góry z góryJak odrzucić kontroler widoku modalnego przedstawiony jako "Arkusz formularzy", gdy dotknięcie pojawi się poza arkuszem formularza?
Odpowiedz
Na iOS 4.2 hierarchia widoku aplikacji opartej na kontrolerze nawigacyjnym z formularzem modalnym jest następująca podczas viewWillAppear:
. Gdy pojawi się widok modalny, UITransitionView został zastąpiony przez UIDropShadowView, który zawiera modalną hierarchię widoków.
UIWindow
UILayoutContainerView (regular hierarchy)
UIDimmingView
UITransitionView
Jabłko ostrzegają przed powołując się na subviews wbudowanych w widokach, jak są one traktowane jako prywatne i mogą ulec zmianie w przyszłych wydaniach. Może to potencjalnie uszkodzić twoją aplikację.
Approach 1
Możemy wstawić przejrzystego widoku pomiędzy dwoma ostatnimi subviews z okna, a nie reagować na dotyk zdarzenia oddalając formularz modalne.
Implementacja ta sprawdza, czy hierarchia widoków okna jest zgodna z oczekiwaniami, i jeśli nic nie robi, nic nie robi.
Tworzenie i używanie DismissingView
z viewWillAppear:
w modalne kontrolera widoku.
DismissingView *dismiss = [[DismissingView alloc] initWithFrame:window.frame
selector:@selector(dismissView:) target:self];
[dismiss addToWindow:window];
[dismiss release];
I wdrożenie. Korzystne jest
@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
Sposób 2
W pierwszym podejściu, ten ma dodatkową logikę każdym przypadku dotykowego w postaci modalnej.
Dodaj przezroczysty widok jako widok z przodu okna. Zdarzenia dotykowe w ramie widoku modalnego są przekazywane do niego, a te znajdujące się poza ramką odrzucają formę modalną.
Zanim się pojawi, hierarchia widoku modalnego wygląda następująco. Kiedy się pojawi, UIDropShadowView zastępuje UITransitionView w pod-widokach okna. UILayoutContainerView
UIDropShadowView
UIImageView
UILayoutContainerView
UINavigationTransitionView
UIViewControllerWrapperView
UIView (the modal view)
UINavigationBar
Realizacja jest w większości takie same jak poprzednio, z nowym własności i addToWindow:
zastąpiona addToWindow:modalView:
.
DismissingView można jeszcze dodać do okna w viewWillAppear:
, ponieważ UIDropShadowView zastępuje UITransitionView.
Znów nic nie robimy, jeśli hierarchia widoków nie jest zgodna z oczekiwaniami.
@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];
}
myślę, że prawidłowa odpowiedź brzmi: "nie rób tego"
- 1. oddalenie UIAlertController przedstawiony przez kontrolera widoku modalne
- 2. Dziwne ostrzeżenie zwalniające kontroler widoku modalnego
- 3. Pokaż kontroler widoku modalnego z niestandardową ramką na iPadzie
- 4. Odrzuć/zaktualizuj kontroler widoku modalnego - pamięć?
- 5. UIViewController - przełącznik przedstawiony kontroler widoku bez lampy błyskowej do prezentacji?
- 6. VBA Zapoznaj się z arkuszem roboczym a arkuszem wykresu
- 7. Trudności z centrowaniem kontrolera widoku, gdy jest wyświetlany jako arkusz formularza
- 8. Kiedy ustawiono kontroler widoku nadrzędnego/prezentującego na sterowniku widoku modalnego?
- 9. Dostałem się do innego kontrolera widoku, zanim pojawi się bieżący kontroler widoku.
- 10. ios: jak odrzucić modalny kontroler widoku, a następnie pop pchnąłem kontroler widoku
- 11. iOS8: Odrzuć arkusz formularza na zewnątrz kranu
- 12. Jak przedstawić kontroler widoku modalnego o niestandardowym rozmiarze w środku?
- 13. Jak dodać UIImagePickerController jako widok podrzędny zamiast widoku modalnego
- 14. Kontroler nawigacyjny w widoku modalnym
- 15. ios: Aplikacja próbowała przedstawić zerowy kontroler widoku modalnego na celu
- 16. Jak mogę zaimplementować "przeciągnij w prawo, aby odrzucić" kontroler widoku znajdujący się w stosie nawigacyjnym?
- 17. UIPresentationController zmienia rozmiar, gdy wyświetlany jest inny kontroler widoku.
- 18. Zatrzymaj wykonywanie GCD, gdy pojawi się ViewController
- 19. MKMapView awarii aplikacji, gdy kontroler widoku pojawiło
- 20. Jak utworzyć przezroczysty modalny kontroler UIViewController?
- 21. Odrzuć dwa kontrolery widoku modalnego.
- 22. Korzystanie z modeli i formularzy poza Django?
- 23. WPF zatrzymać routingu zdarzenia, gdy pojawi się MessageBox?
- 24. iOS - odrzucenie UIDatePicker przedstawiony jako inputView
- 25. Jak dodać dodatkowe pola formularza poza blokiem deklaracji formularza
- 26. SVG animacji pojawi się „poza zakresem” na IE & kant
- 27. Jak poprawnie usunąć SFSafariViewController jako kontroler widoku podrzędnego?
- 28. Jak zapobiec aktualizacji tabeli widoku NSFetchedResultsController, gdy kontroler zniknie?
- 29. Co się stanie, gdy pojawi się przepełnienie timestampu (rowversion)?
- 30. Jak automatycznie odrzucić UIActionSheet
znacznie prostsze rozwiązanie tutaj: http: // stackoverflow.com/questions/2623417/iphone-sdk-dismissing-modal-viewcontrollers-on-ipad-by-click-outside-of-it – onekiloparsec
@ Cédric To rozwiązanie nie jest wystarczająco dobre dla naszego przypadku użycia. Dodaj popover, który wykracza poza granice widoku i bam. To rozwiązanie pęka. – Mazyod