UIViewController üzerinden clearColor UIViewController'ı görüntüle


150

UIViewControllerAlt UIViewControllergörünüm / modun şeffaf olması ve alt görünüme eklenen bileşenlerin görünür olması gibi başka bir görünümün üstünde bir alt görünüm / mod olarak bir görünüm var . Sorun var alt görünümü yerine clearColor için siyah arka plan gösterir olmasıdır. UIViewSiyah bir arka plan değil bir clearColor olarak yapmaya çalışıyorum . Bunun neyin yanlış olduğunu bilen var mı? Herhangi bir öneri takdir.

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];
}

ÇÖZÜLDÜ : Sorunları çözdüm . Hem iPhone hem de iPad için çok iyi çalışıyor. Siyah arka plan olmadan Modal View Controller sadece clearColor / şeffaf. Değişiklikten gerektiğini tek şey yerini ise UIModalPresentationFullScreenhiç UIModalPresentationCurrentContext. Ne kadar basit!

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];

DİKKAT: Eğer bir kullanıyorsanız modalPresentationStyleözelliği 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];

DİKKAT: Kötü haber, yukarıdaki çözümün iOS 7'de çalışmadığıdır. İyi haber şu ki, iOS7 için sorunu çözdüm! Birinden yardım istedim ve işte şöyle dedi:

Bir görünüm denetleyicisini kalıcı olarak sunarken iOS, altındaki görünüm denetleyicilerini sunulduğu süre boyunca görünüm hiyerarşisinden kaldırır. Modal olarak sunulan görünüm denetleyicinizin görünümü şeffaf olsa da, altında siyah olan uygulama penceresi dışında hiçbir şey yoktur. iOS 7 UIModalPresentationCustom, iOS'un sunulan görünüm denetleyicisinin altındaki görünümleri kaldırmamasına neden olan yeni bir kalıcı sunum stili tanıttı . Ancak, bu kalıcı sunum stilini kullanmak için, sunuyu işlemek ve animasyonları kapatmak için kendi geçiş temsilcinizi sağlamanız gerekir. Bu, WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 adresindeki 'Görünüm Denetleyicilerini Kullanan Özel Geçişler' konuşmasında özetlenmiştir. kendi geçiş temsilcinizin nasıl uygulanacağını kapsayan .

Yukarıdaki sorun için çözümümü iOS7'de görebilirsiniz: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
rootViewController öğesinin modalPresentationStyle öğesini ayarladığınızdan emin olun, aksi takdirde çalışmaz
Thorsten

Lütfen bu cevabın yorumuna bir göz atın stackoverflow.com/a/25990081/1418457 , işe yarıyor
onmyway133

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

Self.modalPresentationStyle = UIModalPresentationCurrentContext yapmak zorunda kaldım; çalışmasını sağlamak için sunulan görünüm denetleyicisiyle değil, sunumla değil.
Tulleb

1
Brody'nin cevabını aşağıdan kontrol edin. modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; sorunu çözecek
GoodSp33d

Yanıtlar:


143

iOS8 +

İOS8 + 'da artık şeffaf bir arka plana sahip bir görünüm denetleyicisi sunmak için yeni modalPresentationStyle UIModalPresentationOverCurrentContext'i kullanabilirsiniz:

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    

5
Kabul edilen cevap olmalı. Daha önce kabul edilen cevap eski nedenlerden dolayı hala geçerlidir, ancak bu önerilen yöntemdir.
Tomasz Bąk

3
Sadece ios 8 için geliştiriyorsanız, bu cevapla devam edin! Çalışıyor
Mário Carvalho

2
Bu iyi, ama son satır olmamalı [self presentViewController:modalViewController animated:YES completion:nil];mı? (targetController yerine)?
SuperDuperTango

3
Bunu benim için çalışmak için modalViewController.view.backgroundColor = UIColor.clearColor () çözüm için teşekkürler
Pramod

Herkes bana pushviewcontroller için kod sağlayabilir (navigasyon denetleyicisi demek).
Alok

140

ÇÖZÜLDÜ : Sorunları çözdüm . Hem iPhone hem de iPad için çok iyi çalışıyor. Siyah arka plan olmadan Modal View Controller sadece clearColor / şeffaf. Değiştirmem gereken tek şey UIModalPresentationFullScreen yerine UIModalPresentationCurrentContext değiştirilir. Ne kadar basit!

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];

DİKKAT: navigationController öğesinin modalPresentationStyle özelliğini kullanıyorsanız:

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];

DİKKAT: Kötü haber, yukarıdaki çözümün iOS 7'de çalışmadığıdır. İyi haber şu ki, iOS7 için sorunu çözdüm! Birinden yardım istedim ve işte şöyle dedi:

Bir görünüm denetleyicisini kalıcı olarak sunarken iOS, altındaki görünüm denetleyicilerini sunulduğu süre boyunca görünüm hiyerarşisinden kaldırır. Modal olarak sunulan görünüm denetleyicinizin görünümü şeffaf olsa da, altında siyah olan uygulama penceresi dışında hiçbir şey yoktur. iOS 7, iOS'un sunulan görünüm denetleyicisinin altındaki görünümleri kaldırmamasına neden olan yeni bir kalıcı sunum stili UIModalPresentationCustom'i tanıttı. Ancak, bu kalıcı sunum stilini kullanmak için, sunuyu işlemek ve animasyonları kapatmak için kendi geçiş temsilcinizi sağlamanız gerekir. Bu, WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 kendi geçiş temsilcinizin nasıl uygulanacağını kapsayan 'Görünüm Denetleyicilerini Kullanan Özel Geçişler' konuşmasında özetlenmiştir .

Yukarıdaki sorun için çözümümü iOS7'de görebilirsiniz: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
self.modalPresentationStyle = UIModalPresentationCurrentContext;yaptım.
Adriano Lucas

4
btw .. self.modalPresentationStyle = UIModalPresentationCurrentContext nedeniyle gözlemledim; animasyon ile modalViewController sunmuyor .. herhangi bir fikir?
Devarshi

1
@Miraaj Sonra UIViewController çalışmalıdır göstermeden önce UIModalPresentationFullScreen için modalPresentationStyle geri ayarıself.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
yüksek teknoloji

1
Bunu iOS 6 ve 7'de çalıştırarak, sunumu canlandırırken yeni görünüm denetleyicisi açıktır, ancak bir kez yerine yerleştirildiğinde arka plan siyaha döner. İşten çıkarmayı canlandırırken tekrar netleşir. Başka kimse bu sorunu yaşadı mı?
Drew C

3
@pkamb iOS 7 için çözümü güncelledim. stackoverflow.com/a/11252969/1344459 Umarım size yardımcı olur.
hightech

114

Yani tamamen görsel düşünürler ve film şeridi hayranları için şunları yapabilirsiniz:

1. Görünüm Denetleyicisini Sunma

Bağlam tanımlayın

2. Sunulan Görünüm Denetleyicisi

Sunu: Aşırı Mevcut Bağlam


Bu kabul edilen cevap olmalı. Bunun çalışması için tek yapmanız gereken, daha sonra modsal denetleyicideki görünümün arka plan rengini temizlemek için ayarlayın.
Jesse

Kabul edildi, film şeridi seçenekleri bu durumda kodun üzerine yazılır.
C0D3

17
Bu cevap çok tatlı, şimdi diyabetim var.
GeneCode

25

Swift 3 ve iOS10 çözümü:

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)

16

Bu bir kontrol sürükleme segue kullanarak xCode 7 beta 4'ten. Hedefinizin arka planını temizlemek için ayarlayın ve IB'deki segue özelliklerini şu şekilde ayarlayın (nb. Sunum "Tam Ekranda" da olabilir):

resim açıklamasını buraya girin


2
TEŞEKKÜR EDERİM. Segue fix + @pasevin tarafından ViewControllers cevap yaptım ve çalıştı!
CSawy

1
Bu sorumu yanıtladı. Çok teşekkür ederim. Yukarı oy verin: D
Nate4436271

8

İOS7'de çalışmanın en kolay yolunu buldum ve iOS8, modallyPresentedVC'de (modally sunmak istediğiniz ViewController) UModalPresentationOverCurrentContext'e PresentationStyle'ı ayarlamaktır:

[modallyPresentedVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[modallyPresentedVC.navigationController setModalPresentationStyle:UIModalPresentationOverCurrentContext];

ve iOS7 nedeniyle sunumuVC (modallyPresented'ı sunan denetleyici) ile ilgili UIModalPresentationCurrentContext:

[presentingVC setModalPresentationStyle:UIModalPresentationCurrentContext];
[presentingVC.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];

Çünkü işler iOS7 ve iOS8'de farklı işleniyor. Tabii eğer kullanmıyorsanız navigationController özelliklerini ayarlamanız gerekmez. Umarım yardımcı olur.


domuz pastırmamı kurtardım! Teşekkürler
Ördek

5

Swift2 sürümü:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
vc.view.backgroundColor = UIColor.clearColor()
vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen // orOverCurrentContext to place under navigation
self.presentViewController(vc, animated: true, completion: nil)

4

Başka bir yol (özel geçiş oluşturmaya gerek yoktur ve iOS 7'de çalışır)

Storyboard'u kullanma:

Özgürlük boyutu ile Çocuk Görüntüleme Denetleyicisini oluşturun, görünüm genişliğini 500x500 olarak ayarlayın (örneğin) ve bir sonraki yöntemi ekleyin:

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

Sonra Form Sayfası ile bir Modal segue oluşturun ve test edin.


Harikasın!!! bu aslında çalışıyor !!! (IB "özgürlük" boyutunu ayarlamak anithing cose etkilemez simüle bir metrik, ama neyse, çalışıyor !!!) ve çok basit !!!
Radu Simionescu

4

Özel segue ile iOS 7 çözümü:

CustomSegue.h
#import <UIKit/UIKit.h>

    @interface CustomSegue : UIStoryboardSegue <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>

    @end



CustomSegue.m
#import "CustomSegue.h"

@implementation CustomSegue

-(void)perform {

    UIViewController* destViewController = (UIViewController*)[self destinationViewController];
    destViewController.view.backgroundColor = [UIColor clearColor];
    [destViewController setTransitioningDelegate:self];
    destViewController.modalPresentationStyle = UIModalPresentationCustom;
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
}


//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

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

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *inView = [transitionContext containerView];
    UIViewController* toVC = (UIViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^{

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
}


//===================================================================
// - UIViewControllerTransitioningDelegate
//===================================================================

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    //I will fix it later.
    //    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    //    controller.isPresenting = NO;
    //    return controller;
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

@end

Yüksek teknoloji koduna dayalı çözüm.


Ne zaman ben tarafından [self dismissViewControllerAnimated: YES tamamlandığında: NULL]; Bir istisna alıyorum ??
Asadullah Ali

Bu kod için evet. Veya animasyon çalışmaya başlamak için animationControllerForDismissedController yöntemini uygulamanız gerekir.
Max Gribov

4

Benim için bu çalışıyor:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


    [self presentViewController:vc animated:NO completion:nil];

MMPushNotificationViewControllerŞeffaf Görünüm denetleyicisidir ve ayrıca MMPushNotificationViewControllergörünüm rengini saydam renk olarak yaptım. Şimdi Yaptıklarım ve Transparentviewcontroller'ımı yaptım.


2

İOS7 için

Şimdi bunu iOS7 özel geçişlerini kullanarak başarmanın bir yolu var, bu şekilde:

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];

Özel geçişinizi oluşturmak için 2 şeye ihtiyacınız vardır:

  • Bir TransitionDelegate nesnesi (uygulama <UIViewControllerTransitionDelegate> )
  • Bir "AnimatedTransitioning" nesnesi (uygulayarak <UIViewControllerAnimatedTransitioning>)

Bu eğiticide özel geçişler hakkında daha fazla bilgi bulabilirsiniz .


Animatör sınıfına mainviewcontroller ve ikinci görünüm denetleyici sınıfını eklemenizin özel nedenleri var mı? neden doğrudan UIViewController * toVC = (UIViewController *) kullanmadınız [transitionContext viewControllerForKey: UITransitionContextToViewControllerKey]; UIViewController * fromVC = (UIViewController *) [transitionContext viewControllerForKey: UITransitionContextFromViewControllerKey];
Satyam Raikar

Bu benim öğretici değil, bu yüzden bu konuda ins ve çıkışları bilmiyorum. Demek istediğin geçerli.
Kirualex

2

İşleri Büyük tarihinde -iOS7 ve iOS8

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:vc animated:NO completion:nil];

İkinci en iyi cevabın kopyası.
Tomasz Bąk

2

Ayrıca pencereyi görünüme 'yeniden ekleyebilirsiniz'.

OneViewController *vc = [[OneViewController alloc] init];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:vc animated:YES completion:nil];
} else {
    [self presentModalViewController:vc animated:YES];
}

[[[UIApplication sharedApplication] keyWindow] insertSubview:self.view atIndex:0];

Ve bu şekilde sunum canlandırılabilir.


1

İOS 7 için ve yalnızca Interface Builder kullanılarak Sunum, kalıcı moddaki tüm görünüm denetleyicilerinde "Geçerli Akım Bağlamı" olarak ayarlanarak gerçekleştirilebilir. Navigasyon kontrolörleri için bile.

Örneğin, tüm bu görünüm denetleyicilerinde ayarlayın:

NavController -> RootViewController -> ModalViewController

resim açıklamasını buraya girin


0

Storyboard / Interface builder ile çok fazla oynamadım, ancak bana çıkan şey, görünüme açık renkli (yani% 100 alfa / see-through) olduğunu ve aynı zamanda opak ( % 0 alfa - tamamen katı). Bu iki şey birbirine benzemiyor. Ben self.view.opaque = YES;hattı yorum ve o zaman işe yarar görmek;)

Ah, sadece düşündüğüm başka bir şey - görünüm denetleyicinizin alfa arka planına sahip olması tamamen mümkündür, ancak elbette alfa, programın temel penceresinin veya kök görünüm denetleyicisinin rengine kadar gösterecektir. varsayılan siyah. Tüm uygulamanızın temel katmanının şeffaf bir arka planı olamaz - neye şeffaf? Arkasında ne var? Şeffaflığın içinden görmek için bir şey olmalı. bu mantıklı mı?


Self.view.opaque = YES; ve çalışmıyor. :-(
hightech

Cevabımın ikinci bölümünü okudun mu? Kurulumunuza bağlı olarak istediğinizi yapamayabilirsiniz. ClearColor VC'nin arkasına ne koyuyorsunuz? Belki bunu sıralayabiliriz ^^
WendiKidd

-3

Görünümü sunarken "self.modalPresentationStyle = UIModalPresentationCurrentContext;" kullanın

İyi çalışacak :)


1
Bu sadece mevcut cevapların söylediklerini tekrarlıyor.
Pang
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.