Как добавить представление в качестве подпредставления для определенных контроллеров

У меня есть несколько раскадровок в моем приложении. Я хочу добавить представление всегда вверху чуть ниже панели навигации для некоторых контроллеров. Как я могу этого добиться?

Я уже использовал делегат навигации и добавил вид в окно, но не повезло. Шаги, чтобы показать серый вид в прикрепленном изображении. 1. При нажатии кнопки на этом контроллере представления; серый вид должен отображаться и оставаться в верхней части контроллеров до тех пор, пока все сканирование устройства не будет выполнено, должен ли пользователь перейти к любому из viewControllers.

введите здесь описание изображения


person Devendra Agnihotri    schedule 21.05.2019    source источник
comment
Вы хотите, чтобы этот вид всегда находился под панелью навигации навигационного контроллера?   -  person Rico Crescenzio    schedule 21.05.2019
comment
@ Rico Crescenzio -да, я хочу, чтобы это представление всегда находилось под панелью навигации навигационного контроллера, но для некоторых контроллеров   -  person Devendra Agnihotri    schedule 21.05.2019
comment
Итак, вы пытались вместо этого добавить представление в представление navigationController? нравится navigationController?.view.addSubview(grayView)   -  person Rico Crescenzio    schedule 21.05.2019
comment
Это добавит представление в представлении навигации не ниже представления навигации.   -  person Devendra Agnihotri    schedule 21.05.2019
comment
Да, вам нужно настроить положение просмотра, например, добавить ограничение на панель навигации.   -  person Rico Crescenzio    schedule 21.05.2019


Ответы (2)


Вы можете создать подкласс UINavigationController и добавить в него представление.

class NavigationController: UINavigationController {

    let customView = UIView()
    let iconImgView = UIImageView()
    let msgLbl = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        customView.isHidden = true
        customView.translatesAutoresizingMaskIntoConstraints = false
        customView.backgroundColor = .gray
        view.addSubview(customView)

        iconImgView.contentMode = .scaleAspectFit
        iconImgView.translatesAutoresizingMaskIntoConstraints = false
        customView.addSubview(iconImgView)

        msgLbl.numberOfLines = 0
        msgLbl.lineBreakMode = .byWordWrapping
        msgLbl.textColor = .white
        msgLbl.translatesAutoresizingMaskIntoConstraints = false
        customView.addSubview(msgLbl)

        customView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
        customView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        customView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

        iconImgView.widthAnchor.constraint(equalToConstant: 40).isActive = true
        iconImgView.heightAnchor.constraint(equalToConstant: 40).isActive = true
        iconImgView.centerYAnchor.constraint(equalTo: customView.centerYAnchor).isActive = true
        iconImgView.leadingAnchor.constraint(equalTo: customView.leadingAnchor, constant: 15).isActive = true
        iconImgView.trailingAnchor.constraint(equalTo: msgLbl.leadingAnchor, constant: 15).isActive = true

        msgLbl.topAnchor.constraint(equalTo: customView.topAnchor, constant: 10).isActive = true
        msgLbl.bottomAnchor.constraint(equalTo: customView.bottomAnchor, constant: 10).isActive = true
        msgLbl.trailingAnchor.constraint(equalTo: customView.trailingAnchor, constant: -15).isActive = true
        msgLbl.heightAnchor.constraint(greaterThanOrEqualToConstant: 30).isActive = true
    }

    func showCustomView(message: String, icon: UIImage) {
        msgLbl.text = message
        iconImgView.image = icon
        customView.isHidden = false
    }
    func hideCustomView() {
        customView.isHidden = true
    }
}

Вставьте все ваши контроллеры представления в этот навигационный контроллер. Если вы хотите показать/скрыть серый вид в контроллере представления, используйте

Показать

(self.navigationController as? NavigationController)?.showCustomView(message: "Any Message", icon: UIImage(named: "anyImage")!)

Скрыть

(self.navigationController as? NavigationController)?.hideCustomView()

Когда вы нажимаете другой контроллер представления из того же контроллера навигации, представление не будет скрыто, пока вы не вызовете метод скрытия

person RajeshKumar R    schedule 21.05.2019

Вы можете просто создать пользовательский UIView с соответствующим frame и вызвать addSubview() на view, к которому вы хотите его добавить.

lazy var customView: UIView = {
    let customView = UIView(frame: CGRect.init(x: 0, y: self.view.safeAreaInsets.top, width: UIScreen.main.bounds.width, height: 100))
    customView.backgroundColor = .gray
    return customView
}()

@IBAction func onTapButton(_ sender: UIButton) {
    self.view.addSubview(customView)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.customView.removeFromSuperview()
}

Чтобы добавить его ниже navigationBar, используйте y позицию frame как self.view.safeAreaInsets.top. При этом ваш customView всегда будет выравниваться ниже navigationBar.

Вы можете создать представление с помощью height в соответствии с вашими требованиями. Я использовал height = 100.

Укажите правильный frame, и вы сможете добавить любой вид как subView к другому виду.

введите здесь описание изображения

person PGDev    schedule 21.05.2019
comment
@PGDev- это добавит представление для всех контроллеров, но я хочу добавить это представление для некоторых контроллеров. - person Devendra Agnihotri; 21.05.2019
comment
Затем используйте self.view.addSubview(customView) для конкретных контроллеров. - person PGDev; 21.05.2019
comment
Кроме того, пожалуйста, уточните требование немного больше, если это не поможет. - person PGDev; 21.05.2019