iOS Present modal view controller on startup without flash

前端 未结 9 1150
囚心锁ツ
囚心锁ツ 2020-12-08 00:53

I\'d like to present modally, at first startup, a tutorial wizard to the user.

Is there a way to present a modal UIViewController on application startup

相关标签:
9条回答
  • 2020-12-08 01:15

    Bruce's answer pointed me in the right direction, but because my modal can appear more often than just on launch (it's a login screen, so it needs to appear if they log out), I didn't want to tie my overlay directly to the presentation of the view controller.

    Here is the logic I came up with:

        self.window.rootViewController = _tabBarController;
        [self.window makeKeyAndVisible];
    
        WSILaunchImageView *launchImage = [WSILaunchImageView new];
        [self.window addSubview:launchImage];
    
        [UIView animateWithDuration:0.1f
                              delay:0.5f
                            options:0
                         animations:^{
                             launchImage.alpha = 0.0f;
                         } completion:^(BOOL finished) {
                             [launchImage removeFromSuperview];
                         }];
    

    In a different section I perform the logic of presenting my login VC in the typical self.window.rootViewController presentViewController:... format which I can use regardless if it's an app launch or otherwise.

    If anyone cares, here is how I created my overlay view:

    @implementation WSILaunchImageView
    
    - (instancetype)init
    {
        self = [super initWithFrame:[UIScreen mainScreen].bounds];
        if (self) {
            self.image = WSILaunchImage();
        }
        return self;
    }
    

    And here's the logic for the launch image itself:

    UIImage * WSILaunchImage()
    {
        static UIImage *launchImage = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (WSIEnvironmentDeviceHas480hScreen()) launchImage = [UIImage imageNamed:@"LaunchImage-700"];
            else if (WSIEnvironmentDeviceHas568hScreen()) launchImage = [UIImage imageNamed:@"LaunchImage-700-568h"];
            else if (WSIEnvironmentDeviceHas667hScreen()) launchImage = [UIImage imageNamed:@"LaunchImage-800-667h"];
            else if (WSIEnvironmentDeviceHas736hScreen()) launchImage = [UIImage imageNamed:@"LaunchImage-800-Portrait-736h"];
        });
        return launchImage;
    }
    

    Aaaaand just for completion's sake, here is what those EnvironmentDevice methods look like:

    static CGSize const kIPhone4Size = (CGSize){.width = 320.0f, .height = 480.0f};
    
    BOOL WSIEnvironmentDeviceHas480hScreen(void)
    {
        static BOOL result = NO;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            result = CGSizeEqualToSize([UIScreen mainScreen].bounds.size, kIPhone4Size);
        });
        return result;
    }
    
    0 讨论(0)
  • 2020-12-08 01:24

    may be your can use the "childViewController"

    UIStoryboard *storyboard = self.window.rootViewController.storyboard;
    TutorialViewController* tutorialViewController = [storyboard instantiateViewControllerWithIdentifier:@"tutorial"];
    
    [self.window addSubview: tutorialViewController.view];
    [self.window.rootViewController addChildViewController: tutorialViewController];
    
    [self.window makeKeyAndVisible];
    

    When you need to dismiss your tutor, you can remove its view from the superview. Also you can add some animation on the view by setting the alpha property.Hope helpful:)

    0 讨论(0)
  • 2020-12-08 01:28
    let vc = UIViewController()
    vc.modalPresentationStyle = .custom
    vc.transitioningDelegate = noFlashTransitionDelegate
    present(vc, animated: false, completion: nil)
    
    class NoFlashTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate {
    
        public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
            if source.view.window == nil,
                let overlayViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController(),
                let overlay = overlayViewController.view {
                    source.view.addSubview(overlay)
                    UIView.animate(withDuration: 0, animations: {}) { (finished) in
                        overlay.removeFromSuperview()
                }
            }
            return nil
        }
    }
    
    0 讨论(0)
提交回复
热议问题