2016-09-12 38 views
8

tôi thực hiện tùy chỉnh chiều cao thanh điều hướng, bởi subclassing nó với mã sau đâyiOS 10 tùy chỉnh chiều cao thanh điều hướng

class TMNavigationBar: UINavigationBar { 

    ///The height you want your navigation bar to be of 
    static let navigationBarHeight: CGFloat = 44.0 

    ///The difference between new height and default height 
    static let heightIncrease:CGFloat = navigationBarHeight - 44 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initialize() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initialize() 
    } 

    private func initialize() { 
     let shift = TMNavigationBar.heightIncrease/2 

     ///Transform all view to shift upward for [shift] point 
     self.transform = 
      CGAffineTransformMakeTranslation(0, -shift) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let shift = TMNavigationBar.heightIncrease/2 

     ///Move the background down for [shift] point 
     let classNamesToReposition: [String] = ["_UINavigationBarBackground"] 
     for view: UIView in self.subviews { 
      if classNamesToReposition.contains(NSStringFromClass(view.dynamicType)) { 
       let bounds: CGRect = self.bounds 
       var frame: CGRect = view.frame 
       frame.origin.y = bounds.origin.y + shift - 20.0 
       frame.size.height = bounds.size.height + 20.0 
       view.frame = frame 
      } 
     } 
    } 

    override func sizeThatFits(size: CGSize) -> CGSize { 
     let amendedSize:CGSize = super.sizeThatFits(size) 
     let newSize:CGSize = CGSizeMake(amendedSize.width, TMNavigationBar.navigationBarHeight); 
     return newSize; 
    } 
} 

Tiếp theo vấn đề chỉ xảy ra trên iOS 10: (không gian đen giữa thanh & xem)

enter image description here

Không biết điều gì đang xảy ra ở đó. Nhưng trong storyboard nó tạo ra cảnh báo này, và không có cách nào để sửa chữa nó trong IB (cảnh báo chỉ xuất hiện khi tôi thay đổi phân lớp của thanh điều hướng trong IB).

enter image description here

+1

Cảnh báo storyboard là về chiều rộng, chiều cao không. Và nó không có gì để làm với mã của bạn. - _problem_ là gì? Bạn nói "vấn đề sau" nhưng bạn không bao giờ nói những gì nó _is_. – matt

+0

Vui lòng xem ảnh chụp màn hình được cập nhật, nó hiển thị không gian màu đen giữa chế độ xem & navBar – ignotusverum

+0

Vậy điều gì gây ra không gian màu đen? Phần dưới cùng của thanh điều hướng có quá cao hay là đầu của chế độ xem quá thấp? Bạn có một trình gỡ lỗi. Gỡ lỗi! Trong trường hợp này, hãy sử dụng trình gỡ lỗi Xem để _see_ khung xem của bạn là gì. – matt

Trả lời

11

Tôi đã kiểm tra giao diện gỡ lỗi và đây là những gì tôi nhìn thấy (vì vậy về cơ bản nó đang cố gắng để thay đổi hướng chiều cao thanh, cắn nó vẫn giống nhau và nó hiển thị không gian chỉ đen - đó là cửa sổ màu):

enter image description here

Với cuộc điều tra sau đó tôi nhận thấy rằng nó không phải gọi: "_UINavigationBarBackground"

sau đó, tôi đã kiểm tra view.classForCoder từ nhanh en umeration và phát hiện ra rằng khóa được đổi thành "_UIBarBackground", vì vậy tôi đã cập nhật layoutSubviews():

override func layoutSubviews() { 
    super.layoutSubviews() 

    let shift = TMNavigationBar.heightIncrease/2 

    ///Move the background down for [shift] point 
    let classNamesToReposition = isIOS10 ? ["_UIBarBackground"] : ["_UINavigationBarBackground"] 

    for view: UIView in self.subviews { 

     if classNamesToReposition.contains(NSStringFromClass(view.classForCoder)) { 
      let bounds: CGRect = self.bounds 
      var frame: CGRect = view.frame 
      frame.origin.y = bounds.origin.y + shift - 20.0 
      frame.size.height = bounds.size.height + 20.0 
      view.frame = frame 
     } 
    } 
} 

Chúc mừng.

+0

Điều này không hiệu quả đối với tôi. Tôi đang làm theo các bước chính xác mà bạn đã đề xuất. Tôi thấy rằng con trỏ là đi tất cả các nơi trong lớp trên nhưng nó không bao giờ nhận được cuộc gọi 'override func sizeThatFits (kích thước: CGSize) -> CGSize {...}' vì vậy tôi không thể nhìn thấy chiều cao cập nhật? Bất kỳ ý tưởng? – Hemang

+0

Tôi đã tạo [gist] (https://gist.github.com/hemangshah/5698f7f1a931922831950319de4caa0e) cho điều đó. Xin hãy xem một lần. – Hemang

15

Hoạt động trên iOS 10, Swift 3.0:

extension UINavigationBar { 
    open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     let screenRect = UIScreen.main.bounds 
     return CGSize(width: screenRect.size.width, height: 64) 
    } 
} 
+1

Cảm ơn! Tôi đã giải quyết được vấn đề của mình! :) –

+0

Làm thế nào để sử dụng chức năng mở rộng này? – Hemang

+0

@Hemang, chỉ cần đặt nó trong tệp Extensions.swift trống (và thêm 'nhập UIKit' làm dòng đầu tiên) trong dự án của bạn. –

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