代码之家  ›  专栏  ›  技术社区  ›  Daniel Bramhall

使用Swift从底部向上推视图控制器

  •  20
  • Daniel Bramhall  · 技术社区  · 11 年前

    我想使用Swift推动一个视图控制器,并设置其动画,使其从底部显示并向上移动。我有以下代码来推送视图控制器:

    let helloTableViewController = self.storyboard!.instantiateViewControllerWithIdentifier("helloTableViewController") as! HelloTableViewController
    self.navigationController!.pushViewController(helloTableViewController, animated: true)
    

    我从 another question 但似乎无法在Swift中发挥作用:

    CATransition *animation = [CATransition animation]; 
    [animation setDuration:2]; 
    [animation setType:kCATransitionPush]; 
    [animation setSubtype:kCATransitionFromTop]; 
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
    SecondView *sObj=[[SecondView alloc] initWithNibName:@"SecondView" bundle:nil];
    [self.navigationController pushViewController:sObj animated:YES];
    [[sObj.view layer] addAnimation:animation forKey:@"SwitchToView1"];
    
    6 回复  |  直到 7 年前
        1
  •  45
  •   Besat    9 年前

    瑞士法郎:

    用于推送:

        // push view controller but animate modally
        let storyBoard: UIStoryboard = UIStoryboard(name: "myStoryBoard", bundle: nil)
        let vc = storyBoard.instantiateViewController(withIdentifier: "myViewControllerIdentifier") as! MyViewController
    
        let navigationController = self.navigationController
    
    
        vc.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Close", style: .plain, target: vc, action: #selector(vc.closeView))
        vc.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: vc, action: nil)
    
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionMoveIn
        transition.subtype = kCATransitionFromTop
        navigationController?.view.layer.add(transition, forKey: nil)
        navigationController?.pushViewController(vc, animated: false)
    

    在vc中,用于pop:

    func closeView() {
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionReveal
        transition.subtype = kCATransitionFromBottom
        navigationController?.view.layer.add(transition, forKey: nil)
        _ = navigationController?.popViewController(animated: false)
    }
    
        2
  •  30
  •   philipp    6 年前

    这是推送的代码

    let transition:CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
    transition.type = CATransitionType.push
    transition.subtype = CATransitionSubtype.fromBottom
    self.hostNavController?.view.layer.add(transition, forKey: kCATransition)
    self.hostNavController?.popViewController(animated: true)
    

    您可以使用的转换类型是

    kCATransitionFromLeft
    kCATransitionFromBottom
    kCATransitionFromRight
    kCATransitionFromTop
    
        3
  •  7
  •   Jogendra.Com    6 年前

    更新了Swift 5和Xcode 11.4

    当前动画样式中的控制器推送

        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
    
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
        transition.type = CATransitionType.moveIn
        transition.subtype = CATransitionSubtype.fromTop
        self.navigationController?.view.layer.add(transition, forKey: nil)
        self.navigationController?.pushViewController(viewController, animated: false)
    

    Dismiss样式的PopToView控制器

                let transition:CATransition = CATransition()
            transition.duration = 0.5
            transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
            transition.type = CATransitionType.reveal
            transition.subtype = CATransitionSubtype.fromBottom
            self.navigationController?.view.layer.add(transition, forKey: kCATransition)
            self.navigationController?.popViewController(animated: false)
    
        4
  •  5
  •   Starsky    7 年前

    我也遇到过类似的情况,我需要在视图控制器上显示带有一些UIBarButtonItems的导航项,但当以模态方式显示时,它没有显示出来。它只在从navigationController推送时显示,但我真的需要底部的动画->向上的 我尝试了上面的CATransition示例,但它带来了另一个错误,在动画过程中,有一个黑色阴影/半透明背景。 最后我提出了一个非常简单的解决方案:

    let someVC = storyboard?.instantiateViewController(withIdentifier: "SomeVC") as! SomeVC
    let navController = UINavigationController(rootViewController: someVC)
    navigationController?.present(navController, animated: true, completion: nil)
    

    要关闭视图控制器并完全摆脱导航控制器,只需调用:

    self.dismiss(animated: true, completion: nil)
    

    这将关闭视图控制器,并将从内存中释放navigationController。

    这最终是一个简单的解决方案,但我花了一些时间才想出它。也许我会节省别人的时间:)

        5
  •  4
  •   Community Mohan Dere    6 年前

    Swift 5.0及更高版本

      let transition:CATransition = CATransition()
      transition.duration = 0.5
      transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
      transition.type = CATransitionType.push
      transition.subtype = CATransitionSubtype.fromTop
      self.navigationController!.view.layer.add(transition, forKey: kCATransition)
    
        6
  •  3
  •   glyvox    7 年前

    Swift 4.2+解决方案基于 Nex Mishra's answer :

    let transition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
    transition.type = .push
    transition.subtype = .fromBottom
    navigationController?.view.layer.add(transition, forKey: kCATransition) 
    navigationController?.pushViewController([destination VC], animated: false)