iOS: Modal ViewController dengan latar belakang transparan

180

Saya mencoba menghadirkan pengontrol tampilan secara modern, dengan latar belakang transparan. Tujuan saya adalah membiarkan tampilan pengontrol tampilan yang disajikan dan disajikan ditampilkan pada saat yang bersamaan. Masalahnya adalah, ketika animasi presentasi selesai, tampilan pengendali tampilan presentasi menghilang.

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

Saya tahu saya bisa menambahkan tampilan sebagai subview, tetapi saya ingin menghindari solusi ini karena beberapa alasan. Bagaimana saya bisa memperbaikinya?

Michael
sumber
4
@TheKing Kedengarannya seperti Michael, seperti saya, ingin tampilan modal menjadi transparan, muncul sebagai lapisan gel yang melayang di atas tampilan utama (presentasi). Menciptakan perasaan pengguna tetap dalam konteks saat ini sambil membuat pengaturan cepat, sebagai lawan pergi ke beberapa fungsi utama lainnya (dalam tampilan terpisah).
Basil Bourque
Stackoverflow.com/q/27598846/1603234 ini membuat saya tersenyum, sekarang giliran Anda :)
Hemang
Lihat jawaban saya di sini stackoverflow.com/a/29794201/1606125 untuk iOS 8
Pankaj Wadhwa
versi cepat di sini stackoverflow.com/a/34578402/3380878
Mojtabye
1
Untuk iOS 10 berfungsi UIModalPresentationOverFullScreen seperti inigo333 yang disebutkan di bawah ini.
Josef Rysanek

Jawaban:

97

Kode berikut ini hanya berfungsi di iPad.

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

Saya akan menambahkan sub tampilan.

Ini diskusi yang sangat bagus. Lihatlah komentar secara khusus. Bukan hanya jawabannya.

Modal View

Jika aku jadi kamu, aku tidak akan melakukannya. Saya akan menambahkan tampilan sub dan melakukannya. Tampaknya memberi saya kontrol yang lebih baik terhadap banyak hal.

EDIT:

Seperti yang disebutkan oleh Paul Linsay, karena iOS 8 yang dibutuhkan hanyalah UIModalPresentationOverFullScreenmodalPresentationStyle dari ViewController yang disajikan. Ini juga akan mencakup tombol navigationBar dan tabBar.

SP
sumber
18
Ini tidak bekerja pada iOS 7 dan juga pada iPhone, hal ini adalah bahwa Anda harus menentukan modalPresentationStyle = UIModalPresentationCurrentContextpada presenter pandangan controller, dan tidak dalam disajikan satu.
redent84
6
Ya itu berfungsi tetapi HANYA jika Anda mengatur ini pada hierarki tampilan yang lebih tinggi ViewController . (mis. a NavigationControlleratau instance dari pengontrol tampilan menu slide Anda misalnya).
iGranDav
4
Anehnya, dalam kasus saya ini hanya berfungsi setelah mengatur gaya modal UIModalPresentationCustom, dan hanya jika diatur tepat sebelum presentViewControllerdaripada pada viewDidLoad.
mojuba
5
Karena iOS 8 semua yang diperlukan adalah UIModalPresentationOverFullScreen untuk modalPresentationStyle dari ViewController yang disajikan.
Paul Linsay
1
Setelah sekitar 1000 upaya, saya menyadari Anda perlu mengatur modalPresentationStyle sebelumnyaviewDidLoad . Saya melakukannya di konstruktor dan berhasil.
bendytree
186

Bagi orang yang mencoba untuk mendapatkan ini untuk bekerja di iOS 8, "Apple-disetujui" cara untuk menampilkan transparan controller tampilan modal adalah dengan menetapkan modalPresentationStyle pada saat ed kontroler untuk UIModalPresentationOverCurrentContext.

Ini bisa dilakukan dalam kode, atau dengan mengatur properti segue di storyboard.

Dari dokumentasi UIViewController:

UIModalPresentationOverCurrentContext

Gaya presentasi di mana konten ditampilkan hanya atas konten pengontrol tampilan induk. Tampilan di bawah konten yang disajikan tidak dihapus dari hierarki tampilan ketika presentasi selesai. Jadi jika pengendali tampilan yang disajikan tidak mengisi layar dengan konten buram, konten yang mendasarinya akan terlihat.

Saat menyajikan pengontrol tampilan dalam popover, gaya presentasi ini hanya didukung jika gaya transisi adalah UIModalTransitionStyleCoverVertical. Mencoba menggunakan gaya transisi yang berbeda memicu pengecualian. Namun, Anda dapat menggunakan gaya transisi lain (kecuali transisi ikal parsial) jika pengontrol tampilan induk tidak dalam popover.

Tersedia di iOS 8.0 dan yang lebih baru.

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

Video 'View Controller Advancements in iOS 8' dari WWDC 2014 menjelaskan hal ini secara terperinci.

catatan:

  • Pastikan untuk memberikan pengontrol tampilan Anda warna latar belakang yang jelas, jangan sampai itu benar-benar tembus pandang!
  • Anda harus mengatur ini sebelum mempresentasikan yaitu pengaturan parameter ini di viewDidLoaddari the disajikanViewController tidak akan mempengaruhi
Jeff C.
sumber
32
Catatan - Tampaknya target di mana Anda perlu mengatur modalPresentationStyle telah berubah. Misalnya, di iOS 7, agar ini berfungsi, saya perlu mengatur modalPresentationStyle dari View Controller yang mencoba membuka modal ke UIModalPresentationCurrentContext . Namun, agar ini berfungsi di iOS8, saya perlu mengatur modalPresentationStyle dari tampilan modal yang akan ditampilkan ke UIModalPresentationOverCurrentContext .
u2Fan
1
Jika menggunakan segue di storyboard Anda, Anda harus mengatur gaya presentasi di sana. Setidaknya inilah yang bekerja untuk saya.
Julian B.
Saya menambahkan tiga baris ini dalam metode init di controller tampilan yang disajikan, dan bekerja seperti pesona: self.providesPresentationContextTransitionStyle = YA; self.definesPresentationContext = YA; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
inigo333
2
Di iOS 8+, saya harus menyajikan modal dari UINavigationController sehingga presentasi dari seorang anak tidak memberikan apa yang saya butuhkan. Sebaliknya, sourceVCadalah self.navigationController. Juga, hanya setelah mengatur gaya presentasi target sebagai kustom, saya bisa melihatnya. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Mudah-mudahan itu akan membantu seseorang.
devdc
Catatan - Panggilan presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextdi menghadirkan VC. Tidak berfungsi di dalamVC yang disajikan. Percayalah, saya mencoba.
smileham
104

Di iOS 8.0 dan di atas dapat dilakukan dengan menyetel properti modalPresentationStyle untuk UIModalPresentationOverCurrentContext

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

Lihat Gambar Terlampir

sat20786
sumber
5
Ini adalah satu-satunya solusi yang bisa saya peroleh untuk bekerja. Sangat sederhana juga. Cukup tambahkan ini ke VC presentasi Anda sebelum modal segue.
Siriss
1
Xcoe 9.2 / iOS 11.2 cepat .customdan .overFullScreenberfungsi.
William Hu
Dan sepertinya jika Anda mengatur .overFullScreenpengontrol tampilan ini viewWillAppeartidak akan dipanggil.
William Hu
Satu hal lagi, presentedController.view.backgroundColor = #color#harus ditulis dalam presentedController's viewDidLoad, atau yang lain presentedController' s kehidupan terganggu.
DawnSong
44

Kode ini berfungsi dengan baik di iPhone di bawah iOS6 dan iOS7:

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

Dalam hal ini Anda kehilangan animasi slide-on. Untuk mempertahankan animasi, Anda masih dapat menggunakan ekstensi "tidak elegan" berikut:

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

Jika presentingV kami terletak di dalam UINavigationController atau UITabbarController, Anda harus beroperasi dengan pengendali itu sebagai presentingVC.

Selanjutnya, di iOS7 Anda dapat menerapkan UIViewControllerTransitioningDelegateprotokol penerapan animasi transisi kustom . Tentu saja, dalam hal ini Anda bisa mendapatkan latar belakang yang transparan

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Pertama, sebelum presentasi Anda harus mengatur modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Maka Anda harus menerapkan dua metode protokol

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

Hal terakhir adalah menentukan transisi khusus Anda di CustomAnimatedTransitioningkelas

@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
    }
}
malex
sumber
7
Dikonfirmasi ini berfungsi. Perhatikan bahwa jika viewController Anda ada di dalam navigationController maka pastikan modalPresentationStylejuga diatur!
mxcl
Saya pikir dalam kasus yang paling umum adalah ide yang baik untuk memperlakukan pengontrol navigasi Anda sebagai presVC.
Malex
Ya, menggunakan modalPresentationStyle ini tidak mungkin untuk mendapatkan animasi presentasi ((
malex
2
@ alex ya itu berfungsi maaf: kesalahan saya adalah mengatur modalPresentationStyle ke UIModalPresentationCurrentContext untuk presentVC bukan PrenstingVC.
tiguero
5
@mxcl Dan jika navigationController viewController Anda ada di dalam tabBarController maka pastikan modalPresentationStyle diatur juga;)
Thomas CG de Vilhena
21

Saya sedikit kesulitan dengan Interface Builder dari XCode 7 untuk mengatur Gaya Presentasi seperti yang disarankan @VuuGopalTewari. Dalam versi ini, sepertinya tidak ada mode presentasi Over Current Contextatau Over Full Screenuntuk segue. Jadi, untuk membuatnya bekerja, saya mengatur mode ke Default:

masukkan deskripsi gambar di sini dengan masukkan deskripsi gambar di sini

Selain itu saya mengatur mode presentasi dari pengontrol tampilan yang disajikan secara digital ke Over Full Screen:

masukkan deskripsi gambar di sini

Bastian
sumber
Ini bekerja untuk saya, tidak perlu kode. Saya menggunakan Xcode 7.2, cepat dan targetnya adalah iOS 8.0
LightMan
Ini juga berhasil bagi saya. +1 untuk jawaban yang benar. Terima kasih :)
Augustine PA
Jawaban terbaik di sini!
shinyuX
1
Tidak ada kode = Jawaban terbaik. Bastian memenangkan game ini. Mohon beri +1 semua jawaban ini.
GeneCode
Jawaban ini berhasil..menghabiskan lebih dari satu jam untuk hal ini
user578386
18

Buat segue untuk mempresentasikan secara modern dan setel properti Presentasi dari segue ke konteks saat ini, ia akan bekerja 100%

masukkan deskripsi gambar di sini

Venu Gopal Tewari
sumber
3
Saya mengagumi 100% surer, itu berhasil! Kuncinya adalah menerapkannya pada segue. Terima kasih banyak
Badr
Jika Anda tidak memiliki segue Anda terhubung ke sebuah tombol dan Anda memanggilnya secara terprogram maka pastikan untuk menetapkan pengidentifikasi dan memanggil performSegueWithIdentifier daripada presentViewController
user3344977
1
Saya mencoba semua jawaban lain, tetapi ini adalah satu-satunya yang bekerja untuk saya di iOS9.
endavid
14

PresentViewController dengan latar belakang Transparan - di iOS 8 dan iOS 9

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

Dan di MYViewController mengatur warna latar belakang hitam dan mengurangi opacity

Ashwini Chougale
sumber
12

Ini sedikit cara hacky, tetapi bagi saya kode ini berfungsi (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;

    }];
}];

Kode ini juga berfungsi di iPhone

Mak
sumber
Terima kasih - inilah yang saya butuhkan - menampilkan layar "Bantuan" awal di atas Beranda utama. Cantik!
Matt H
1
Hari ini, saya menghabiskan hampir 3 jam browsing dan mencari solusi yang berfungsi untuk iOS7 dan iOS8. Mengingat jawaban ini 1,5 tahun dan saya menggunakan ECSlidingViewController, ini adalah satu-satunya solusi yang berhasil! Terima kasih @Mak.
Centurion
Sempurna. Juga, jika Anda tidak peduli dengan animasi, 3 baris dalam penyelesaian batin berfungsi dengan baik Terima kasih!
RasTheDestroyer
setelah 3 jam dihabiskan tanpa hasil apa pun menemukan ini, tepuk tangan, semoga aku bisa memilih lebih banyak: D
alessioarsuffi
11

Kategori ini cocok untuk saya (ios 7, 8 dan 9)

File H

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

File M.

@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
Ted
sumber
1
Saya memeriksa semua jawabannya .. tetapi bagi saya jawaban Anda adalah pekerjaan yang sempurna .. "+1" untuk ini. @Ted
g212gs
1
Saya pikir saya tidak dapat menemukan solusi. Terima kasih banyak!
CopperCash
10

Solusi untuk jawaban ini menggunakan swift adalah sebagai berikut.

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

Jika Anda menggunakan Storyboard, Anda dapat mengikuti langkah ini:

  1. Tambahkan view controller (V2), atur UI seperti yang Anda inginkan
  • tambahkan UIView - set latar belakang menjadi hitam dan opacity menjadi 0,5
  • tambahkan UIView lain (2) - yang akan berfungsi sebagai popup Anda (Harap perhatikan bahwa UIView dan UIView (2) harus memiliki level / hierarki yang sama. Jangan membuat imageview sebagai tampilan anak, jika tidak opacity dari uiview akan mempengaruhi UIView (2))
  1. Hadir V2 Secara Modis

  2. Klik segue. Di inspektur Atribut, Tetapkan Presentasi sebagai Atas Layar Penuh . Hapus animasi jika Anda mau

Storyboard

  1. Pilih V2. Di inspektur Atribut, Tetapkan Presentasi sebagai Atas Layar Penuh . Periksa Definisikan Konteks dan Berikan Konteks

Storyboard

  1. Pilih MainView dari V2 Anda (Pls. Periksa gambar). Atur backgroundColor ke Clear Color

Storyboard

dhin
sumber
6

Saya menambahkan tiga baris ini dalam metode init di controller tampilan yang disajikan, dan bekerja seperti pesona:

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

EDIT (bekerja di iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Sesuai dokumentasi:

UIModalPresentationOverFullScreen Gaya tampilan tampilan di mana tampilan yang disajikan meliputi layar. Tampilan di bawah konten yang disajikan tidak dihapus dari hierarki tampilan ketika presentasi selesai. Jadi jika pengendali tampilan yang disajikan tidak mengisi layar dengan konten buram, konten yang mendasarinya akan terlihat.

Tersedia di iOS 8.0 dan yang lebih baru.

inigo333
sumber
1
Bekerja di iOS 10.2.
Josef Rysanek
4

Cara alternatif adalah dengan menggunakan "tampilan wadah". Buat saja alpha di bawah 1 dan embed dengan seque. XCode 5, target iOS7. Diuji pada iPhone.

masukkan deskripsi gambar di sini

Tampilan kontainer tersedia dari iOS6. Tautan ke posting blog tentang itu.

Mike Glukhov
sumber
3

Saya telah membuat objek untuk menangani presentasi dari apa yang saya sebut "modal superposed", yang berarti ia mempertahankan tampilan latar belakang dan memungkinkan Anda untuk memiliki modal dengan latar belakang transparan.

Ini memiliki satu, metode sederhana yang melakukan ini:

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

Sangat penting untuk menyetel modalPresentationCapturesStatusBarAppearanceproperti ke YESdan memaksa tampilan bilah status untuk memperbarui, jika pengontrol tampilan yang disajikan Anda memiliki yang berbeda preferredStatusBarStyle.

Objek ini harus memiliki @property (assign, nonatommic) isPresenting

Anda ingin objek ini untuk memenuhi ke UIViewControllerAnimatedTransitioningdan UIViewControllerTransitioningDelegateprotokol dan menerapkan metode berikut:

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

    return self;
}

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

    return self;
}

dan:

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

Ini melakukan animasi slide-in-from-the-bottom meniru modal animasi default, tetapi Anda dapat membuatnya apa pun yang Anda inginkan.

Yang penting adalah bahwa pandangan pengendali tampilan presentasi akan tetap di belakang, membiarkan Anda membuat efek transparan.

Solusi ini berfungsi untuk iOS 7+

Pedro Mancheno
sumber
Terima kasih atas jawaban anda.
Salman Khakwani
3

Cara yang sangat sederhana untuk melakukan ini (menggunakan Storyboards, misalnya) adalah:

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

Hal ini akan menyajikan UIViewControllerdalam Storyboardmodally, tapi dengan latar belakang tembus.

Jared
sumber
3

Bekerja untuk iOS 7-10

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)
    }
}
iluvatar_GR
sumber
2

Untuk merangkum semua jawaban dan komentar yang baik di sini dan masih memiliki animasi saat pindah ke yang baru, ViewControllerinilah yang saya lakukan: (Mendukung iOS 6 dan lebih tinggi)

Jika Anda menggunakan UINavigationController\ UITabBarControllerini adalah cara untuk pergi:

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

Jika Anda melakukannya, Anda akan kehilangan modalTransitionStyleanimasi. Untuk mengatasinya Anda dapat dengan mudah menambahkan ke SomeViewControllerkelas Anda ini:

-(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;
}
Segev
sumber
2

Tentu saja Anda harus mengatur UIModalPresentationCurrentContext, tetapi tempat untuk mengatur clearColor juga sangat penting! Anda tidak dapat mengatur latar belakang dalam fungsi viewDidLoad, atur sebelum tampilan memuat seperti pada pengontrol tampilan root atau pada fungsi init dari pengontrol yang akan ditampilkan!

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

atau

- (instancetype)init {

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

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

    return self;
}
Santiago
sumber
Ini adalah petunjuk yang membantu saya di antara yang lainnya. Terima kasih atas bantuan Anda.
Tomasz Nazarenko
1

Jika Anda menggunakan modal segue, pastikan untuk mengaturnya sebagai gambar ini (Anda dapat mematikan animasi jika Anda mau)masukkan deskripsi gambar di sini

Ahmed
sumber
1

Metode lengkap yang diuji pada iOS 7 dan iOS 8.

@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
BB9z
sumber
1

Cepat 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)
Aleksey Shevchenko
sumber
0

di appdelegate:

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

di Anda controller tampilan pertama dari mana Anda harus memuat tampilan berikutnya:

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

    }];

di nextViewController Anda yang akan ditambahkan transparan:

- (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];
}
Zaraki
sumber
0

Layar Login adalah modal, yang berarti ia duduk di atas layar sebelumnya. Sejauh ini kami memiliki Latar Belakang Kabur, tetapi tidak mengaburkan apa pun; itu hanya latar belakang abu-abu.

Kita perlu mengatur Modal kita dengan benar.

target tautan gambar

  • Pertama, kita perlu mengubah latar belakang View Controller's View menjadi Clear color. Ini berarti harus transparan. Secara default, tampilan itu berwarna putih.

  • Kedua, kita perlu memilih Segue yang mengarah ke layar Login, dan di Inspektur Atribut, atur Presentation ke Over Current Context. Opsi ini hanya tersedia jika Tata Letak Otomatis dan Kelas Ukuran diaktifkan.

target tautan gambar

bergemerincing
sumber
0

Atur navigasi modalPresentationStylemenjadiUIModalPresentationCustom

dan mengatur warna latar belakang pengendali tampilan yang disajikan sebagai warna bening.


sumber