Dành cho iOS 13:
Sử dụng .shadowColor
tài sản
Nếu thuộc tính này là không hoặc chứa màu rõ ràng, thanh sẽ không hiển thị bóng
Ví dụ:
let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence
Dành cho iOS 12 trở xuống:
Để làm điều này, bạn nên đặt một hình ảnh bóng tùy chỉnh. Nhưng để hình ảnh bóng được hiển thị, bạn cũng cần đặt hình nền tùy chỉnh, trích dẫn từ tài liệu của Apple:
Để hình ảnh bóng tùy chỉnh được hiển thị, hình ảnh nền tùy chỉnh cũng phải được đặt bằng phương thức setBackgroundImage (_: for :). Nếu hình nền mặc định được sử dụng, thì hình ảnh bóng mặc định sẽ được sử dụng bất kể giá trị của thuộc tính này.
Vì thế:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Trên đây là cách "chính thức" duy nhất để che giấu nó. Thật không may, nó loại bỏ độ trong của thanh.
Tôi không muốn hình nền, chỉ là màu sắc
Bạn có những lựa chọn đó:
Màu đặc, không trong mờ:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Tạo hình nền nhỏ chứa đầy màu sắc và sử dụng nó.
Sử dụng phương pháp 'hacky' được mô tả dưới đây. Nó cũng sẽ giữ thanh mờ.
Làm thế nào để giữ thanh mờ?
Để giữ độ trong mờ bạn cần một cách tiếp cận khác, nó trông giống như một bản hack nhưng hoạt động tốt. Cái bóng chúng tôi đang cố xóa là một đường chân tóc UIImageView
ở đâu đó bên dưới UINavigationBar
. Chúng ta có thể tìm thấy nó và ẩn / hiển thị nó khi cần thiết.
Các hướng dẫn bên dưới giả sử bạn chỉ cần đường viền tóc ẩn trong một bộ điều khiển của UINavigationController
hệ thống phân cấp.
Khai báo biến đối tượng:
private var shadowImageView: UIImageView?
Thêm phương thức tìm thấy bóng này (chân tóc) UIImageView:
private func findShadowImage(under view: UIView) -> UIImageView? {
if view is UIImageView && view.bounds.size.height <= 1 {
return (view as! UIImageView)
}
for subview in view.subviews {
if let imageView = findShadowImage(under: subview) {
return imageView
}
}
return nil
}
Thêm / chỉnh sửa viewWillAppear/viewWillDisappear
phương thức:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if shadowImageView == nil {
shadowImageView = findShadowImage(under: navigationController!.navigationBar)
}
shadowImageView?.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
shadowImageView?.isHidden = false
}
Phương pháp tương tự cũng sẽ có hiệu quả đối với UISearchBar
chân tóc, và (hầu như) bất cứ điều gì khác mà bạn cần ẩn :)
Rất cám ơn @Leo Natan cho ý tưởng ban đầu!