Mam UIViewController
widok jako widok podrzędny / modalny na wierzchu innego UIViewController
widoku, na przykład widok podrzędny / widok modalny powinien być przezroczysty i wszystkie komponenty dodane do widoku podrzędnego powinny być widoczne. Problem polega na tym, że u mnie podwidok pokazuje czarne tło zamiast mieć clearColor. Staram się, aby UIView
tło było jasne, a nie czarne. Czy ktoś wie, co jest z tym nie tak? Wszelkie sugestie są mile widziane.
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];
SecondViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.opaque = YES;
self.view.backgroundColor = [UIColor clearColor];
}
ROZWIĄZANE : naprawiłem problemy. Działa tak dobrze zarówno na iPhonie, jak i iPadzie. Modalny kontroler widoku bez czarnego tła po prostu przezroczysty / przezroczysty. Jedyne, co trzeba zmienić to Wymieniłem UIModalPresentationFullScreen
się UIModalPresentationCurrentContext
. Jakie to proste!
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
UWAGA: Jeśli używasz modalPresentationStyle
właściwości navigationController
:
FirstViewController.m
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];
UWAGA: Zła wiadomość jest taka, że powyższe rozwiązanie nie działa na iOS 7. Dobrą wiadomością jest to, że naprawiłem problem z iOS7! Poprosiłem kogoś o pomoc i oto co powiedział:
Podczas prezentacji kontrolera widoku modalnie system iOS usuwa kontrolery widoku znajdujące się pod nim z hierarchii widoku na czas, w którym jest prezentowany. Chociaż widok kontrolera widoku prezentowanego modalnie jest przezroczysty, pod nim nie ma nic poza oknem aplikacji, które jest czarne. iOS 7 wprowadził nowy modalny styl prezentacji UIModalPresentationCustom
, który powoduje, że iOS nie usuwa widoków pod prezentowanym kontrolerem widoku. Jednak aby użyć tego modalnego stylu prezentacji, musisz zapewnić własnego delegata przejścia do obsługi prezentacji i odrzucania animacji. Jest to opisane w wykładzie „Niestandardowe przejścia przy użyciu kontrolerów widoku” z WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218, w którym omówiono również, jak zaimplementować własnego delegata przejścia.
Możesz zobaczyć moje rozwiązanie powyższego problemu w iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
źródło
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
rozwiąże problem,Odpowiedzi:
iOS8 +
W iOS8 + możesz teraz użyć nowego modalPresentationStyle UIModalPresentationOverCurrentContext, aby przedstawić kontroler widoku z przezroczystym tłem:
źródło
[self presentViewController:modalViewController animated:YES completion:nil];
? (zamiast targetController)?ZDECYDOWANY : naprawiłem problemy. Działa tak dobrze zarówno na iPhonie, jak i iPadzie. Modalny kontroler widoku bez czarnego tła po prostu przezroczysty / przezroczysty. Jedyną rzeczą, którą muszę zmienić, jest zastąpienie UIModalPresentationFullScreen na UIModalPresentationCurrentContext. Jakie to proste!
FirstViewController.m
UWAGA: Jeśli używasz właściwości modalPresentationStyle nawigacjiController:
FirstViewController.m
UWAGA: Zła wiadomość jest taka, że powyższe rozwiązanie nie działa na iOS 7. Dobrą wiadomością jest to, że naprawiłem problem z iOS7! Poprosiłem kogoś o pomoc i oto co powiedział:
Podczas prezentacji kontrolera widoku modalnie system iOS usuwa kontrolery widoku znajdujące się pod nim z hierarchii widoku na czas, w którym jest prezentowany. Chociaż widok kontrolera widoku prezentowanego modalnie jest przezroczysty, pod nim nie ma nic oprócz okna aplikacji, które jest czarne. iOS 7 wprowadził nowy modalny styl prezentacji, UIModalPresentationCustom, który powoduje, że iOS nie usuwa widoków pod prezentowanym kontrolerem widoku. Jednak aby użyć tego modalnego stylu prezentacji, musisz zapewnić własnego delegata przejścia do obsługi prezentacji i odrzucania animacji. Jest to opisane w wykładzie „Niestandardowe przejścia przy użyciu kontrolerów widoku” z WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218, w którym omówiono również, jak zaimplementować własnego delegata przejścia.
Możesz zobaczyć moje rozwiązanie powyższego problemu w iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
źródło
self.modalPresentationStyle = UIModalPresentationCurrentContext;
zrobił to.self.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
Więc dla czysto wizualnych myślicieli i fanów storyboardów możesz zrobić:
1. Prezentacja kontrolera widoku
2. Kontroler widoku prezentowanego
źródło
Rozwiązanie Swift 3 i iOS10:
źródło
To pochodzi z xCode 7 beta 4 przy użyciu kontrolnego przeciągania płynnego. Po prostu ustaw tło miejsca docelowego, aby wyczyścić, i ustaw właściwości przejścia w IB w następujący sposób (uwaga. Prezentacja może być również „Na pełnym ekranie”):
źródło
Znalazłem najłatwiejszy sposób, aby to działało na iOS7 i iOS8, to dodanie set PresentationStyle do UIModalPresentationOverCurrentContext na modallyPresentedVC (ViewController, który chcesz przedstawić modalnie) z powodu iOS8:
i UIModalPresentationCurrentContext na presentVC (kontrolerze, który prezentuje modallyPresented) z powodu iOS7:
Ponieważ sprawy są obsługiwane inaczej na iOS7 i iOS8. Oczywiście nie musisz ustawiać właściwości navigationController, jeśli ich nie używasz. Mam nadzieję, że to pomoże.
źródło
Wersja Swift2:
źródło
Inny sposób (nie ma potrzeby tworzenia niestandardowego przejścia i działa na iOS 7)
Korzystanie ze scenorysu:
Utwórz kontroler widoku podrzędnego z dowolnym rozmiarem, ustaw szerokość widoku na 500x500 (na przykład) i dodaj następną metodę:
Następnie utwórz segue modalne za pomocą Arkusza formularzy i przetestuj je.
źródło
Rozwiązanie iOS 7 z niestandardowym segue:
Rozwiązanie oparte na najnowocześniejszym kodzie.
źródło
Dla mnie to działa:
MMPushNotificationViewController
jest kontrolerem widoku przezroczystego, a takżeMMPushNotificationViewController
ustawiłem kolor widoku jako clearcolor. Teraz wszystko, co zrobiłem i zrobiłem mój Transparentviewcontroller.źródło
Dla iOS7
Jest teraz sposób na osiągnięcie tego za pomocą niestandardowych przejść iOS7, w ten sposób:
Aby utworzyć niestandardowe przejście, potrzebujesz 2 rzeczy:
<UIViewControllerTransitionDelegate>
)<UIViewControllerAnimatedTransitioning>
)Więcej informacji na temat niestandardowych przejść można znaleźć w tym samouczku .
źródło
Działa świetnie na iOS7 i iOS8
źródło
Możesz także „ponownie dodać” okno do widoku.
W ten sposób prezentacja może być animowana.
źródło
W przypadku iOS 7 i tylko przy użyciu Interface Builder można to osiągnąć, ustawiając prezentację na „Over Current Context” na wszystkich kontrolerach widoku zaangażowanych w prezentację modalną. Nawet dla kontrolerów nawigacji.
Na przykład ustaw go na wszystkich tych kontrolerach widoku:
NavController -> RootViewController -> ModalViewController
źródło
Nie bawiłem się zbytnio z konstruktorem Storyboard / Interface, ale wyskakuje mi z oczu, że mówisz, że widok jest wyraźny (tj. 100% alfa / przezroczystość), a także mówisz, że jest nieprzezroczysty ( 0% alfa - całkowicie stałe). Te dwie rzeczy nie wydają się być ze sobą powiązane. Zakomentowałbym
self.view.opaque = YES;
linię i zobaczyłem, czy wtedy zadziała;)Ach, coś innego, o czym właśnie pomyślałem - jest całkowicie możliwe, że twój kontroler widoku ma tło alfa, ale oczywiście alfa będzie się wyświetlać do koloru okna podstawowego lub kontrolera widoku głównego programu, co jest przez domyślny czarny. Sama warstwa podstawowa całej aplikacji nie może mieć przezroczystego tła - przezroczystego dla czego? Co za tym stoi? Musi być coś, co można zobaczyć PRZEZ przejrzystość. Czy to ma sens?
źródło
Po prostu użyj „self.modalPresentationStyle = UIModalPresentationCurrentContext;” w widoku prezentacji
Będzie działać dobrze :)
źródło