iOS: Saydam arka plana sahip Modal ViewController


180

Saydam bir arka plan ile, modally bir görünüm denetleyicisi sunmaya çalışıyorum. Amacım hem sunulan hem de sunulan görünüm denetleyicilerinin görüşünün aynı anda görüntülenmesine izin vermektir. Sorun, sunum animasyonu sona erdiğinde, sunum görünümü denetleyicisinin görünümü kaybolur.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

Görünümü bir alt görünüm olarak ekleyebileceğimi biliyorum, ancak bir nedenden dolayı bu çözümden kaçınmak istiyorum. Nasıl düzeltebilirim?


4
@TheKing Michael gibi geliyor, benim gibi modsal görüntünün yarı saydam olmasını, birincil (sunum) görünüm üzerinde asılı duran bir jel katmanı olarak görünmesini istiyor. Kullanıcının, diğer bazı önemli işlevlere (ayrı bir görünümde) geçmek yerine, hızlı bir ayar yaparken mevcut bağlamda kalması hissini yaratır.
Basil Bourque

Bu stackoverflow.com/q/27598846/1603234 Beni güldürüyor, şimdi sıra sende :)
Hemang

Cevabımı buradan görebilirsiniz stackoverflow.com/a/29794201/1606125 iOS 8 için
Pankaj Wadhwa


1
İOS 10 için aşağıda belirtilen inigo333 olarak UIModalPresentationOverFullScreen çalışıyor.
Josef Rysanek

Yanıtlar:


97

Aşağıdaki kod yalnızca iPad'de çalışır.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Alt görünüm ekleyerek giderdim.

İşte çok iyi bir tartışma. Yorumlara özellikle bakın. Sadece cevap değil.

Kalıcı Görünüm

Ben olsaydım yapmazdım. Bir alt görünüm ekleyip yaparım. Bana işler üzerinde daha iyi bir kontrol sağlıyor gibi görünüyor.

DÜZENLE:

Paul Linsay tarafından belirtildiği gibi, iOS 8'den beri gereken tek şey UIModalPresentationOverFullScreen, sunulan ViewController'ın modalPresentationStyle'ı içindir. Bu ayrıca navigationBar ve tabBar düğmelerini de kapsar.


18
Bu does iOS 7'de iş ve ayrıca iPhone'da, şey belirtmek zorunda olmasıdır modalPresentationStyle = UIModalPresentationCurrentContextüzerinde sunum görünümü denetleyicisi değil de sunulan one.
redent84

6
Evet işe yarıyor ancak SADECE bunu görünüm hiyerarşinizin daha üstüne ayarladıysanız ViewController. (örneğin a NavigationControllerveya slayt menüsü görüntüleme denetleyicinizin örneği).
iGranDav

4
Tuhaf bir şekilde, benim durumumda sadece modal stili ayarladıktan sonra UIModalPresentationCustomve sadece presentViewControlleryerine daha önce ayarlanmışsa çalıştı viewDidLoad.
mojuba

5
İOS 8 olduğundan, gereken ViewController'ın modalPresentationStyle'ı için UIModalPresentationOverFullScreen gereklidir.
Paul Linsay

1
Yaklaşık 1000 denemeden sonra daha modalPresentationStyle önceviewDidLoad ayarlamanız gerektiğini fark ettim . Yapıcıda yaptım ve işe yaradı.
bendytree

186

Bunun iOS 8'de çalışmasını sağlamaya çalışanlar için, şeffaf bir modsal görünüm denetleyicisini görüntülemenin "Apple onaylı" yolu modalPresentationStyle , mevcut ed denetleyicisini şu şekilde ayarlamaktır UIModalPresentationOverCurrentContext.

Bu kod olarak veya film şeridindeki segue'in özelliklerini ayarlayarak yapılabilir.

UIViewController belgelerinden:

UIModalPresentationOverCurrentContext

İçeriğin yalnızca üst görünüm denetleyicisinin içeriği üzerinde görüntülendiği bir sunum stili. Sunulan içeriğin altındaki görünümler, sunum bittiğinde görünüm hiyerarşisinden kaldırılmaz. Dolayısıyla, sunulan görünüm denetleyicisi ekranı opak içerikle doldurmazsa, temel içerik gösterilir.

Bir görüntüleme denetleyicisini bir popover'da sunarken, bu sunum stili yalnızca geçiş stili UIModalTransitionStyleCoverVertical ise desteklenir. Farklı bir geçiş stili kullanmaya çalışmak bir istisnayı tetikler. Ancak, üst görünüm denetleyicisi bir popover'da değilse, diğer geçiş stillerini (kısmi kıvrılma geçişi hariç) kullanabilirsiniz.

İOS 8.0 ve sonraki sürümlerinde kullanılabilir.

https://developer.apple.com/documentation/uikit/uiviewcontroller

WWDC 2014'ten 'iOS 8'deki Denetleyici Gelişmelerini Görüntüle' videosu buna biraz ayrıntılı olarak giriyor.

Not:

  • Sunulan görünüm kontrolörünüze net bir arka plan rengi verdiğinizden emin olun, aslında görünmemesi için!
  • Sunmadan önce bunu ayarlamanız gerekir, yani bu parametreyi sunulanViewController öğesinde ayarlamak viewDidLoadherhangi bir etki yaratmaz.

32
Not - modalPresentationStyle öğesini değiştirmeniz gereken hedef görünür . Örneğin, iOS 7'de, bunun işe yaramasını sağlamak için, Modal'ı UIModalPresentationCurrentContext'e açmaya çalışan Görünüm Denetleyicilerinin modalPresentationStyle'ını ayarlamam gerekiyordu . Ancak, bunun iOS8'de çalışmasını sağlamak için, UIModalPresentationOverCurrentContext'e görüntülenecek modsal görünümün modalPresentationStyle ayarını yapmam gerekiyordu .
u2Fan

1
Film şeridinizde segues kullanıyorsanız, sunum stilini orada ayarlamanız gerekir. En azından benim için işe yarayan buydu.
Julian B.

Sunulan görünüm denetleyicisinde init yöntemine bu üç satır ekledi ve bir cazibe gibi çalışır: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333

2
İOS 8 ve sonraki sürümlerde, bir UINavigationController'dan bir mod sunmak zorunda kaldım, bu nedenle bir çocuktan sunum yapmak bana ihtiyacım olanı sağlamadı. Bunun yerine, sourceVCöyle self.navigationController. Ayrıca, yalnızca hedef sunum stilini özel olarak ayarladıktan sonra, onu görebiliyordum. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Umarım birine yardım eder.
devdc

Not - Çağrı presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextiçinde sunulması VC. Sunulan VC'de çalışmıyor. Güven bana, denedim.
smileham

104

İOS 8.0 ve üstü sürümlerde , modalPresentationStyle özelliği UIModalPresentationOverCurrentContext olarak ayarlanarak yapılabilir

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

Ekli Resme Bakın


5
Çalışabileceğim tek çözüm bu. Çok basit. Bunu modal segue'ten önce sunum VC'nize eklemeniz yeterlidir.
Siriss

1
Xcoe 9.2 / iOS 11.2 hızlı .customve .overFullScreençalışır.
William Hu

Ve .overFullScreenmevcut görünüm denetleyicisini çağırırsanız çağrılamaz gibi görünüyor viewWillAppear.
William Hu

Bir şey daha, presentedController.view.backgroundColor = #color#içinde yazılmalıdır presentedController's viewDidLoad, yoksa presentedControlleryaşamı kesilir.
DawnSong

44

Bu kod iOS6 ve iOS7 altında iPhone'da sorunsuz çalışır:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

Bu durumda slayt animasyonunu kaçırırsınız. Animasyonu korumak için aşağıdaki "zarif olmayan" uzantıyı kullanabilirsiniz:

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

PresentV ürünümüz UINavigationController veya UITabbarController içinde bulunuyorsa, bu denetleyiciler ile presentVC olarak çalışmanız gerekir.

Ayrıca, iOS7'de UIViewControllerTransitioningDelegateprotokolü uygulayarak özel geçiş animasyonu uygulayabilirsiniz . Tabii ki, bu durumda şeffaf arka plan elde edebilirsiniz

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

İlk önce, sunmadan önce modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Sonra iki protokol yöntemi uygulamak zorunda

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

Son şey, CustomAnimatedTransitioningsınıfta özel geçişinizi tanımlamaktır

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
Bunun çalıştığını doğruladı. NOT senin viewController bir NavigationController içinde olup olmadığını o zaman onun sağlamak olduğunu modalPresentationStyleda ayarlandı!
mxcl

En yaygın durumlarda navigasyon denetleyicinize VC olarak davranmanın iyi bir fikir olduğunu düşünüyorum.
malex

Evet, imkansız bu modalPresentationStyle kullanarak ((animasyonu sunulması olsun
malex

2
@alex evet üzgünüm: benim hatam modalPresentationStyle prenstingVC yerine sunulanVC için UIModalPresentationCurrentContext ayarlamak oldu.
tiguero

5
@mxcl Ve viewController'ın navigationController'ın kendisi bir tabBarController'ın içindeyse, modalPresentationStyle öğesinin de ayarlandığından emin olun;)
Thomas CG de Vilhena

21

Sunum Stilini @VenuGopalTewari'nin önerdiği gibi ayarlamak için XCode 7 Arayüz Oluşturucu ile biraz mücadele ettim. Bu versiyonda, segue için sunum modu yok Over Current Contextveya Over Full Screensunum modu var gibi görünüyor . Böylece, çalışmasını sağlamak için moduDefault :

resim açıklamasını buraya girin ile resim açıklamasını buraya girin

Ayrıca, kalıcı olarak sunulan görünüm denetleyicisinin sunum modunu şu şekilde ayarladım Over Full Screen:

resim açıklamasını buraya girin


Bu benim için çalıştı, kod gerekmez. Xcode 7.2 kullanıyorum, hızlı ve hedef iOS 8.0
LightMan

Bu benim için de işe yaradı. Doğru cevap için +1. Teşekkürler :)
Augustine PA

En iyi cevap burada!
shinyuX

1
Kod yok = En iyi cevap. Bastian bu oyunu kazandı. Lütfen bu cevabı + 1'leyin.
GeneCode

Bu cevap çalıştı ... bunun üzerinde bir saatten fazla harcama
user578386

18

Modal olarak sunmak için bir segue oluşturun ve bu seguein Presentation özelliğini mevcut bağlam üzerinde% 100 çalışacak şekilde ayarlayın

resim açıklamasını buraya girin


3
% 100 sörfçülere hayranım, işe yaradı! Anahtar segue üzerine uygulamaktır. Çok teşekkür ederim
Badr

Segue'iniz bir düğmeye bağlı değilse ve programlı olarak çağırıyorsanız, bir tanımlayıcı ayarladığınızdan ve presentViewController yerine userSegueWithIdentifier'ı aradığınızdan emin olun
user3344977 26:15

1
Diğer tüm cevapları denedim, ancak iOS9'da benim için çalışan tek cevap bu.
endavid

14

Şeffaf arka planlı PresentViewController - iOS 8 ve iOS 9'da

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

Ve MYViewController'da arka plan rengini siyah olarak ayarlayın ve opaklığı azaltın


12

Biraz hileli bir yol, ama benim için bu kod çalışıyor (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Bu kod iPhone'da da çalışır


Teşekkürler - bu tam olarak ihtiyacım olan şeydi - ana Ana Sayfa'nın üstünde bir ilk "Yardım" ekranını gösteriyor. Güzel!
Matt H

1
Bugün, hem iOS7 hem de iOS8 için çalışan çözümü aramak ve aramak için neredeyse 3 saat harcıyorum. Bu cevabın 1.5 yaşında olduğu ve ECSlidingViewController'ı kullandığım göz önüne alındığında, bu işe yarayan tek çözüm! Teşekkürler @Mak.
Centurion

Mükemmel. Ayrıca, animasyon umurumda değilse, iç tamamlama 3 satır mükemmel çalışır Teşekkürler!
RasTheDestroyer

herhangi bir başarı olmadan geçirilen 3 saat sonra bu bulundu, şerefe, ben daha oy oy isterdim: D
alessioarsuffi

11

Bu kategori benim için çalıştı (ios 7, 8 ve 9)

H dosyası

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

M dosyası

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
Tüm cevabı kontrol ettim .. ama benim için cevabınız mükemmel bir iş .. Bunun için "+1". @Ted
g212gs

1
Bir çözüm bulamadığımı düşündüm. Çok teşekkürler!
CopperCash

10

Hızlı cevap kullanarak bu cevabın çözümü aşağıdaki gibi olacaktır.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

Storyboard kullanıyorsanız şu adımı izleyebilirsiniz:

  1. Bir görünüm denetleyicisi (V2) ekleyin, kullanıcı arayüzünü istediğiniz şekilde ayarlayın
  • UIView ekleme - arka planı siyah, opaklığı 0,5 olarak ayarlama
  • açılır pencereniz olarak hizmet edecek başka bir UIView (2) ekleyin (Pls, UIView ve UIView'in (2) aynı seviyeye / hiyerarşiye sahip olması gerektiğini unutmayın.Görüntü görünümünü alt öğe yapmayın, aksi takdirde uiview'ın opaklığı UIView'i etkiler (2))
  1. V2'yi kalıcı olarak sunun

  2. Segue'i tıklayın. Özellikler denetçisinde Sunuyu Tam Ekran Olarak Ayarla . İsterseniz animasyonu kaldırın

Film Şeridi

  1. V2'yi seçin. Özellikler denetçisinde Sunuyu Tam Ekran Olarak Ayarla . Kontrol Bağlamı Tanımlar ve Bağlam Sağlar

Film Şeridi

  1. V2'nizin MainView'unu seçin (Pls. Görüntüyü kontrol edin). BackgroundColor'u Rengi Temizle olarak ayarlama

Film Şeridi


6

Sunulan görünüm denetleyicisindeki init yöntemine bu üç satırı ekledim ve bir cazibe gibi çalışıyor:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

EDIT (iOS 9.3'te çalışıyor):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Belgelere göre:

UIModalPresentationOverFullScreen Sunulan görünümün ekranı kapsadığı görünüm sunum stili. Sunulan içeriğin altındaki görünümler, sunum bittiğinde görünüm hiyerarşisinden kaldırılmaz. Dolayısıyla, sunulan görünüm denetleyicisi ekranı opak içerikle doldurmazsa, temel içerik gösterilir.

İOS 8.0 ve sonraki sürümlerinde kullanılabilir.


1
İOS 10.2 üzerinde çalışma.
Josef Rysanek

4

Alternatif yol "kapsayıcı görünümü" kullanmaktır. Sadece 1'in altında alfa ve sekme ile gömün. XCode 5, hedef iOS7. İPhone'da test edildi.

resim açıklamasını buraya girin

Kapsayıcı görünümü iOS6'dan edinilebilir. Bununla ilgili blog gönderisine bağlantı .


3

Ben "üst üste getirilmiş modal" dediğim şeyin sunumunu işlemek için bir nesne yarattım, yani arka planın görüşünü korur ve şeffaf bir arka plan ile bir modal sahip olmanızı sağlar.

Bunu yapan tek ve basit bir yöntemi vardır:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

Sunulan görünüm denetleyiciniz farklıysa , modalPresentationCapturesStatusBarAppearanceözelliği ayarlamak YESve durum çubuğu görünümünü güncellemeye zorlamak önemlidirpreferredStatusBarStyle .

Bu nesnenin bir @property (assign, nonatommic) isPresenting

Bu nesnenin UIViewControllerAnimatedTransitioningve UIViewControllerTransitioningDelegateprotokollerine uymasını ve aşağıdaki yöntemleri uygulamasını istiyorsunuz :

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

ve:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Bu, varsayılan kalıcı animasyonu taklit eden alttan slaytta bir animasyon yapar, ancak istediğinizi yapabilirsiniz.

Önemli olan, sunan görünüm denetleyicisinin görüşünün arkada kalarak şeffaf bir efekt oluşturmanıza izin vermesidir.

Bu çözüm iOS 7+ için çalışır


Cevabınız için teşekkürler.
Salman Khakwani

3

Bunu yapmanın çok basit bir yolu ( Storyboardsörneğin kullanarak ):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Bu sunacak UIViewControllerbir de Storyboardmodal, ancak yarı saydam bir arka plan ile.


3

İOS 7-10 için çalışma

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

Buradaki tüm iyi cevapları ve yorumları yeniden özetlemek ve yeninize geçerken hala bir animasyona sahip olmak için ViewControlleryaptım: (iOS 6 ve üstünü destekler)

Bir UINavigationController\ kullanmanız UITabBarControlleraşağıdaki yol ise:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Bunu yaparsanız modalTransitionStyleanimasyonunuzu kaybedersiniz . Bunu çözmek için kolayca SomeViewControllersınıfınıza ekleyebilirsiniz :

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

Tabii ki UIModalPresentationCurrentContext'i ayarlamanız gerekir, ancak clearColor'un ayarlanacağı yer de çok önemlidir! ViewDidLoad işlevinde arka plan ayarlayamaz, görünüm kök görünüm denetleyicisindeki veya sunulacak denetleyicinin başlatma işlevinde olduğu gibi yüklenmeden önce ayarlanamaz !

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

veya

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

Bu, diğerleri arasında bana yardımcı olan ipucuydu. Yardımınız için teşekkürler.
Tomasz Nazarenko

1

Kalıcı segue kullanıyorsanız, bu görüntü olarak ayarladığınızdan emin olun (isterseniz animasyonu kapatabilirsiniz)resim açıklamasını buraya girin


1

İOS 7 ve iOS 8'de test edilen eksiksiz bir yöntem.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

Hızlı 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

ekte:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

bir sonraki görünümü yüklemeniz gereken yerden ilk görünüm denetleyicinizde:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

saydam eklenecek nextViewController'ınızda:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

Giriş ekranı bir moddur, yani önceki ekranın üstünde bulunur. Şimdiye kadar Bulanık Arka Planımız var, ancak hiçbir şey bulanıklaştırmıyor; sadece gri bir arka plan.

Modal'ımızı doğru şekilde ayarlamamız gerekiyor.

resim bağlantı hedefi

  • İlk olarak, Görünüm Denetçisinin Görünüm arka planını Net renk olarak değiştirmeliyiz. Sadece şeffaf olması gerektiği anlamına gelir. Varsayılan olarak, bu Görünüm beyazdır.

  • İkinci olarak, Giriş ekranına götüren Segue'i seçmeliyiz ve Özellik Denetçisinde Sunumu Geçerli Akım Aşırı Bağlamına ayarlamalıyız. Bu seçenek yalnızca Otomatik Düzen ve Boyut Sınıfları etkinken kullanılabilir.

resim bağlantı hedefi


0

Set navigasyon var modalPresentationStyleetmekUIModalPresentationCustom

ve sunulan görünüm denetleyicinizin arka plan rengini açık renk olarak ayarlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.