Menu di bawah bilah navigasi dengan animasi di Swift

Masalah saya sangat sederhana, saya tidak tahu cara menampilkan daftar (menu) di bawah bilah Navigasi, ketika saya mengkliknya (di Bilah Navigasi).

Saya ingin melakukan hal yang sama dari gambar ini:

masukkan deskripsi gambar di sini

Saya mencoba melakukan ini:

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)
      })
   }

Dan ini di 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
                  }
               })

            }
         })


      }
   }

Soalnya, tampilan yang ditampilkan lewat di atas Navigation Bar, bukan efek yang saya inginkan. Apakah Anda punya ide tentang bagaimana saya bisa melakukan itu?


person KevinB    schedule 30.05.2017    source sumber


Jawaban (3)


Garis ini

self.window!.addSubview(infoView)

Menempatkannya di atas semua tampilan lain di jendela (termasuk bilah navigasi).

Anda harus mencari melalui hierarki pengontrol tampilan, dimulai dengan rootViewController untuk menemukan yang akan ditambahkan tampilannya.

Lihatlah jawaban atas pertanyaan ini untuk beberapa opsi: iPhone -- Cara menemukan yang paling atas pengontrol tampilan

person Lou Franco    schedule 30.05.2017
comment
Terima kasih atas jawaban Anda, saya memindahkan kode saya dari AppDelegate ke View Controller saat ini dan saya mengubah self.window! untuk melihat sendiri. Sesederhana itu aha! - person KevinB; 01.06.2017

Apakah Anda melihat kakaopod?: https://cocoapods.org/?q=popover

Banyak komponen siap pakai tersedia. Mungkin Anda harus mencari komponen yang sesuai dengan kebutuhan Anda.

Apakah Anda mencoba menampilkan infoView?: Membawa subtampilan berada di depan semua tampilan lainnya

person Community    schedule 30.05.2017

Dengan asumsi Anda membuat subkelas UIViewController maka Anda dapat mengatur properti 'navigationItem' sebagai berikut.

self.navigationItem.title = "Your text"

Salah satu cara umum untuk mengatur teks judul pada pengontrol navigasi adalah dengan mengganti metode delegasi tampilan tabel di bawah ini dan menyalin teks textLabel selnya ke item nav subkelas ViewController.

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