导航栏下方的菜单,包含Swift中的动画

时间:2017-05-30 19:37:05

标签: swift animation swift3 menu uinavigationbar

我的问题很简单,我不知道如何在导航栏下面显示一个列表(菜单),当我点击它时(在导航栏上)。

我想做与此图像相同的事情:

enter image description here

我试着这样做:

func doSomething(){

      let navigationBarHeight = self.navigationController?.navigationBar.frame.height ?? 0
      print(navigationBarHeight)
      let heightTotal = UIApplication.shared.statusBarFrame.height + navigationBarHeight

      DispatchQueue.main.async(execute: {
         appDelegate.infoView(message: "test", Yorigin: heightTotal, color: colorBlueFollow)
      })
   }

这在appDelegate:

func infoView(message: String, Yorigin: CGFloat ,color: UIColor){
      if infoViewIsShowing == false{
         infoViewIsShowing = true

//         let infoViewHeight = self.window!.bounds.height / 14.2
         let infoViewHeight = self.window!.bounds.height / 4.2
         let infoViewY = Yorigin - infoViewHeight

         let infoView = UIView(frame: CGRect(x: 0, y: infoViewY, width: self.window!.bounds.width, height: infoViewHeight))
         infoView.backgroundColor = color
         self.window!.addSubview(infoView)

         let infoLabelWidth = infoView.bounds.width
         let infoLabelHeight = infoView.bounds.height + UIApplication.shared.statusBarFrame.height/2

         let infoLabel = UILabel()
         infoLabel.frame.size.width = infoLabelWidth
         infoLabel.frame.size.height = infoLabelHeight
         infoLabel.numberOfLines = 0

         infoLabel.text = message
         infoLabel.font = UIFont(name: "HelveticaNeue", size: 11)
         infoLabel.textColor = UIColor.white
         infoLabel.textAlignment = .center

         infoView.addSubview(infoLabel)

         // Animate errorView
         UIView.animate(withDuration: 0.2, animations: {

            // Move down
            infoView.frame.origin.y = Yorigin

         }, completion: { (finished: Bool) in
            if finished{

               UIView.animate(withDuration: 0.2, delay: 3, options: .curveLinear, animations: {
                  // move up
                  infoView.frame.origin.y = infoViewY

               }, completion: { (finished: Bool) in
                  if finished {
                     infoView.removeFromSuperview()
                     infoLabel.removeFromSuperview()
                     self.infoViewIsShowing = false
                  }
               })

            }
         })


      }
   }

问题在于,显示的视图正在导航栏上方传递,这不是我想要的效果。你对我怎么做到了吗?

3 个答案:

答案 0 :(得分:1)

你看过cocoapods吗?:https://cocoapods.org/?q=popover

有许多现成的组件可供使用。也许你应该找到一个符合你需求的组件。

您是否尝试将infoView带到前面?: Bringing a subview to be in front of all other views

答案 1 :(得分:1)

这一行

self.window!.addSubview(infoView)

将其置于窗口中所有其他视图的顶部(包括导航栏)。

您应该搜索视图控制器层次结构,从rootViewController开始,找到要添加视图的那个。

查看此问题的答案以获取一些选项:iPhone -- How to find topmost view controller

答案 2 :(得分:0)

假设你是UIViewController的子类,那么你可以设置它的属性'navigationItem',如下所示。

self.navigationItem.title = "Your text"

在导航控制器上设置标题文本的一种常用方法是覆盖下面的tableview委托方法,并将其单元格的textLabel文本复制到子类ViewController的导航项。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      self.navigationItem.title = tableView.cellForRow(at: indexPath)?.textLabel?.text
   }