web-dev-qa-db-ja.com

Swiftカスタムナビゲーションコントローラークラス

読んでくださった皆さん、こんにちは。ありがとう。 Xcode 8.2.1とSwift 3.0を使用して、iOSデバイス用のViberやWhatsAppなどのアプリケーションを書いています。問題があります。アプリにナビゲーションコントローラが必要ですが、シンプルではありません。カスタム画面にしたい私が達成しようとしていることを理解するためにWhatsAppからの印刷画面があります:

Screenshot of WhatsApp chat with somebody

ご覧のとおり、このナビゲーションコントローラーには3つのボタン、ラベル、アバター付きの画像があります。また、色を緑に変えたいです。これを行うために、私はクラスを作成しました:

import UIKit

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationBar.barTintColor = UIColor.green


        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 39, height: 39))
        imageView.contentMode = .scaleAspectFit
        let image = UIImage(named: "logo")
        imageView.image = image
        navigationItem.titleView = imageView


    }
}

そしてそれはこの結果をもたらします: enter image description here ご覧のとおり、写真はありません。このコードを追加すると、

        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 39, height: 39))
        imageView.contentMode = .scaleAspectFit
        let image = UIImage(named: "logo")
        imageView.image = image
        navigationItem.titleView = imageView

viewControllerにロゴ付きの画像が表示されますが、どこかに(たとえば、Interface Builderで)接続する完全なクラスが必要です。ボタン、画像などで美しいナビゲーションコントローラーが作成されます。さらに、別のナビゲーションコントローラーを別の画面に接続します。たとえば、画像は必要なく、ボタンのみです。だから質問です:カスタムナビゲーションコントローラークラスを作成する方法?

私は本当に助けてくれて、どんな助けにも感謝します、ありがとう!

9
Alex

今、私は答えを知っています! Swift 4.1.2に対して記述されます。UIViewControllerから継承された各クラスには、プロパティself.navigationController?.navigationBarまたはnavigationItem。次のような独自のクラスを作成できます。

class CustomNavigationController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let color = UIColor(red: 81 / 255, green: 155 / 255, blue: 22 / 255, alpha: 1.0)
        self.navigationController?.navigationBar.barTintColor = color

        let image = UIImage(named: "logo")
        let imageView = UIImageView(image: image)
        imageView.contentMode = .scaleAspectFit
        navigationItem.titleView = imageView
    }

    private func imageView(imageName: String) -> UIImageView {
        let logo = UIImage(named: imageName)
        let logoImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 35, height: 35))
        logoImageView.contentMode = .scaleAspectFit
        logoImageView.image = logo
        logoImageView.widthAnchor.constraint(equalToConstant: 35).isActive = true
        logoImageView.heightAnchor.constraint(equalToConstant: 35).isActive = true
        return logoImageView
    }

    func barImageView(imageName: String) -> UIBarButtonItem {
        return UIBarButtonItem(customView: imageView(imageName: imageName))
    }

    func barButton(imageName: String, selector: Selector) -> UIBarButtonItem {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: imageName), for: .normal)
        button.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
        button.widthAnchor.constraint(equalToConstant: 35).isActive = true
        button.heightAnchor.constraint(equalToConstant: 35).isActive = true
        button.addTarget(self, action: selector, for: .touchUpInside)
        return UIBarButtonItem(customView: button)
    }

}

これで、このクラスCustomNavigationControllerからUIViewControllersを継承し、ボタン、アイコン、色、ロゴなどを好きなだけ追加できます(もちろん、通常の範囲で)。このような:

class ViewController: CustomNavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = barImageView(imageName: "picture1")

        let firstImage = barImageView(imageName: "picture2")
        let secondButton = barButton(imageName: "picture3", selector: #selector(secondButtonPressed))

        navigationItem.rightBarButtonItems = [firstImage, secondButton]
    }

    @objc func secondButtonPressed() {
        print("Pressed")
    }

}

これは私の解決策ですが、最善ではないかもしれませんが、100%動作します!ありがとうございました!

7
Alex