2014-10-09 29 views
22

Ai đó có thể giúp tôi nhận ra một lần nhấn khi người dùng chạm vào Tiêu đề trong Thanh điều hướng?Nhận dạng nhấn vào tiêu đề thanh điều hướng

Tôi muốn nhận dạng vòi này và sau đó tạo hiệu ứng cho chế độ hiển thị tableHeaderView. Có thể trượt TableView xuống.

Ý tưởng là sau đó người dùng có thể chọn tùy chọn nhanh (từ tableViewHeader) để điền lại TableView.

Tuy nhiên, tôi không thể nhận ra bất kỳ thao tác nhấn nào.

Tôi đang sử dụng Swift.

Cảm ơn bạn.

Trả lời

38

UINavigationBar không hiển thị phân cấp chế độ xem nội bộ của nó. Không có cách nào được hỗ trợ để tham chiếu đến UILabel hiển thị tiêu đề.

Bạn có thể root trong phân cấp chế độ xem “thủ công” (bằng cách tìm kiếm thông qua subviews), nhưng điều đó có thể ngừng hoạt động trong bản phát hành iOS trong tương lai do phân cấp khung là riêng tư.

Một giải pháp khác là tạo UILabel và đặt làm bộ điều khiển chế độ xem navigationItem.titleView. Tùy thuộc vào bạn để phù hợp với phong cách của nhãn mặc định, có thể thay đổi trong các phiên bản iOS khác nhau.

Điều đó nói rằng, nó khá dễ dàng để thiết lập:

override func didMove(toParentViewController parent: UIViewController?) { 
    super.didMove(toParentViewController: parent) 

    if parent != nil && self.navigationItem.titleView == nil { 
     initNavigationItemTitleView() 
    } 
} 

private func initNavigationItemTitleView() { 
    let titleView = UILabel() 
    titleView.text = "Hello World" 
    titleView.font = UIFont(name: "HelveticaNeue-Medium", size: 17) 
    let width = titleView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)).width 
    titleView.frame = CGRect(origin:CGPoint.zero, size:CGSize(width: width, height: 500)) 
    self.navigationItem.titleView = titleView 

    let recognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.titleWasTapped)) 
    titleView.userInteractionEnabled = true 
    titleView.addGestureRecognizer(recognizer) 
} 

@objc private func titleWasTapped() { 
    NSLog("Hello, titleWasTapped!") 
} 

Tôi đang thiết lập kích thước của nhãn chiều rộng tự nhiên của nó (sử dụng sizeThatFits:), nhưng tôi đang thiết lập chiều cao của nó đến 500. Các thanh điều hướng sẽ giữ chiều rộng nhưng thu nhỏ chiều cao theo chiều cao của thanh. Điều này tối đa hóa khu vực có sẵn để khai thác (vì chiều cao tự nhiên của nhãn có thể chỉ ~ 22 điểm nhưng thanh cao 44 điểm).

+0

Giải pháp hoàn hảo. Tôi hoàn toàn đồng ý không tìm kiếm thông qua phân cấp chế độ xem, như các ví dụ khác mà tôi đã tìm thấy, có thể không hoạt động trong tương lai. Cảm ơn bạn rất nhiều. – Richard

+2

Tôi đã gần như có một mình, nhưng không nghi ngờ 'userInteractionEnabled'. +1. –

+0

Tôi gặp vấn đề với giải pháp này. Trên các bản cập nhật sau của văn bản trong nhãn, nhãn chính nó nhảy tới x 0 (bên trái màn hình) vì một lý do nào đó. Có vẻ như một lỗi trong UIKit. Dù sao thì sao? (iOS 10.1.1) – Jonny

15

Đây là giải pháp, mặc dù không siêu thanh lịch. Trong bảng phân cảnh chỉ cần đặt UIButton thông thường vào tiêu đề và đính kèm nó vào một IBAction trong ViewController của bạn. Bạn có thể cần phải làm điều này cho mỗi lần xem.

+2

Đây là giải pháp tuyệt vời, thực sự hoạt động hoàn hảo và dễ thực hiện. – Evgenii

4

Có một giải pháp đơn giản và thanh lịch hơn khi sử dụng trình nhận dạng cử chỉ (ít nhất là cho iOS 9 trở lên).

UITapGestureRecognizer * titleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleTapped)]; 
[self.navigationItem.titleView addGestureRecognizer:titleTapRecognizer]; 

Sau đó, thêm tiêu đề phương pháp khai thác:

-(void) titleTapped { 
    // Called when title is tapped 
} 
+3

Đừng quên định nghĩa 'self.navigationItem.titleView' như trong câu trả lời được chấp nhận. Mặc định là không. – Jonny

1

Một phương pháp đơn giản có thể chỉ tạo recognizer tap cử chỉ và gắn nó vào yếu tố thanh điều hướng của bạn.

// on viewDidLoad 
let tapGestureRecognizer = UITapGestureRecognizer(target:self, action: #selector(YourViewController.somethingWasTapped(_:))) 
self.navigationController?.navigationBar.addGestureRecognizer(tapGestureRecognizer) 

func somethingWasTapped(_ sth: AnyObject){ 
    print("Hey there") 
} 
+1

Cách tốt nhất để làm điều đó. –

+3

Trong trường hợp của tôi, điều này đã phá vỡ chức năng của nút quay lại sau khi một bộ điều khiển xem khác được đẩy lên ngăn xếp. – Georg

+3

Nó sẽ phá vỡ chức năng của các nút khác trong thanh điều hướng –

3

Câu trả lời của Bruno là 90% cho tôi. Tuy nhiên, một điều tôi lưu ý là chức năng UIBarButtonItem cho Bộ điều khiển Điều hướng đã ngừng hoạt động trong các Bộ điều khiển Chế độ xem khác, khi trình nhận dạng cử chỉ này được thêm vào nó. Để khắc phục điều này, tôi chỉ xóa cử chỉ khỏi Trình điều khiển điều hướng khi chế độ xem đang chuẩn bị biến mất:

var tapGestureRecognizer : UITapGestureRecognizer! 

override func viewWillAppear(_ animated: Bool) { 

    tapGestureRecognizer = UITapGestureRecognizer(target:self, action: #selector(self.navBarTapped(_:))) 

    self.navigationController?.navigationBar.addGestureRecognizer(tapGestureRecognizer) 

} 

override func viewWillDisappear(_ animated: Bool) { 

    self.navigationController?.navigationBar.removeGestureRecognizer(tapGestureRecognizer) 

} 

func navBarTapped(_ theObject: AnyObject){ 

    print("Hey there") 

} 
Các vấn đề liên quan