+1

[SWIFT] Tạo navigation bar fade animation

Môi trường phát triển:

  • Swift Language Version: Swift 5
  • Xcode: Version 10.3
  • Deployment Target: 12.0

Bước 1: Khởi tạo màn hình ViewController

Ta tạo màn hình ViewController như hình dưới đây:

Trong đó, ViewController gồm các thành phần sau:

  • CollectionView: Thêm leading, trailing constraint với View's Safe Area và top, bottom constraint với superView.
  • CollectionViewCell: với Identifier = "CollectionCell"
  • image1: Thêm top, leading, trailing, bottom constraint với CollectionViewCell. ContentMode = ScaleToFill.

Ta set backgroundImageshadowImage = UIImage() -> Tạo Transparent Navigation Bar

final class ViewController: UIViewController {
    @IBOutlet private weak var collectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        config()
    }
    
    private func config() {
        // CollectionView's Settings
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.contentInsetAdjustmentBehavior = .never
        
        // NavigationController's Settings
        title = "Navigation Bar"
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.titleTextAttributes =
            [NSAttributedString.Key.foregroundColor: UIColor (red: 1.0/255.0, green: 1.0/255.0, blue: 1.0/255.0, alpha: 0)]
    }
}

Ta thêm statusBarView vào extension UIApplication để gọi các properties của status bar.

extension UIApplication {
    var statusBarUIView: UIView? {
        if #available(iOS 13.0, *) {
            let tag = 38482
            let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
            
            if let statusBar = keyWindow?.viewWithTag(tag) {
                return statusBar
            } else {
                guard let statusBarFrame = keyWindow?.windowScene?.statusBarManager?.statusBarFrame else { return nil }
                let statusBarView = UIView(frame: statusBarFrame)
                statusBarView.tag = tag
                keyWindow?.addSubview(statusBarView)
                return statusBarView
            }
        } else if responds(to: Selector(("statusBar"))) {
            return value(forKey: "statusBar") as? UIView
        } else {
            return nil
        }
    }
}

Bước 2: CollectionView Delegate and DataSource

extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as UICollectionViewCell
        return cell
    }
}

extension ViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.size.width, height: 300)
    }
}

Bước 3: Tạo fade animation cho navigation bar

Ta set tintColor, backgroundColor, titleColor cho NavigationBarbackgroundColor cho statusBarView. Giá trị alpha của whiteColorblackColor thay đổi theo giá trị offset. Khi offset tăng dần đến 1, giá trị alpha = offsetNavigationBar từ từ hiện ra. Khi offset > 1 (scroll down), ta set offset = 1 -> alpha = 1 và NavigationBar hiện ra 100%.

extension ViewController {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var offset = scrollView.contentOffset.y / 150
        if offset > 1 {
            offset = 1
        }
        
        let whiteColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: offset)
        let blackColor = UIColor (red: 1.0/255.0, green: 1.0/255.0, blue: 1.0/255.0, alpha: offset)
        navigationController?.navigationBar.tintColor = blackColor
        navigationController?.navigationBar.backgroundColor = whiteColor
        UIApplication.shared.statusBarUIView?.backgroundColor = whiteColor
        navigationController?.navigationBar.titleTextAttributes =
            [NSAttributedString.Key.foregroundColor: blackColor]
    }
}

Và đây là kết quả:

Tài liệu tham khảo:

https://www.youtube.com/watch?v=rNy6aQQYbuY

Link github:

https://github.com/ndhuy96/SwiftTips/tree/navBarFadeAnimation


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí