Собственный AlertController - PullRequest
       5

Собственный AlertController

0 голосов
/ 15 января 2020

Для моего приложения я хочу реализовать свой собственный AlertController. Но я хотел бы иметь такое же поведение представления, как и UIAlertController: сделать весь экран немного темнее с полупрозрачным фоном и оживить оповещение. Я не хочу, чтобы оно появлялось при модальном представлении.

В идеале я хотел бы представить свой AlertView, такой как UIAlertView, с помощью метода present, например:

let alert = MyAlertController(type: .example)
present(alert, animated: true, completion: nil)

Edit : Извините, на мой взгляд, это было очевидно, ясно, что я хотел, но читая вопрос снова, я вижу проблему ... Так вот, что я попробовал до сих пор. Я создал подкласс UIViewController, ниже вы можете увидеть (укороченный) код.

Текущее поведение : когда я представляю этот ViewController, он просто представляет его в модальном виде вместо затемнения экран и выскакивает мой взгляд. Я знаю, что мне нужно было бы реализовать анимацию, но прежде чем я хочу перейти к

Желаемое поведение : я могу использовать свой класс так же, как UIAlertController (см. над). Мне нужно только инициализировать контроллер, а затем вызвать настоящее. Как мне этого добиться? Я думаю, это должно быть как-то возможно, поскольку UIAlertController также использует упомянутый метод present. Спасибо!

class FRAlertController: UIViewController {

private var alertView: UIView!


private var alertViewCenterXConstraint: NSLayoutConstraint!
private var alertViewCenterYConstraint: NSLayoutConstraint!


init(type: FRAlertControllerType, buttons: Bool = true) {
    super.init(nibName: nil, bundle: nil)

    setupView(type: type, buttons: buttons)
}

private func setupView(type: FRAlertControllerType, buttons: Bool) {        
    setupAlertView()
}

private func setupAlertView() {
    alertView = UIView()
    alertView.backgroundColor = .white
    view.addSubview(alertView)
    alertView.translatesAutoresizingMaskIntoConstraints = false

    alertViewCenterXConstraint = NSLayoutConstraint(item: alertView!, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0)
    alertViewCenterYConstraint = NSLayoutConstraint(item: alertView!, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0)

    let widthConstraint = NSLayoutConstraint(item: alertView!, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width
        , multiplier: 0.7, constant: 0)
    let aspectRatio = NSLayoutConstraint(item: alertView!, attribute: .width, relatedBy: .equal, toItem: alertView, attribute: .height, multiplier: 1.05, constant: 0)

    view.addConstraints([
        alertViewCenterXConstraint,
        alertViewCenterYConstraint,
        widthConstraint,
        aspectRatio
    ])
}


override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.black.withAlphaComponent(0.4)
}
}

1 Ответ

1 голос
/ 18 января 2020

Чтобы представить контроллер представления с помощью пользовательских анимаций, выполните следующие действия:

  1. Создайте контроллер представления, который вы хотите представить.
  2. Создайте пользовательский объект-делегат переходного периода (UIViewControllerTransitioningDelegate) и присвойте его свойству transitioningDelegate контроллера представления. Методы вашего переходного делегата должны создавать и возвращать ваши собственные объекты аниматора при запросе.
  3. Установите modalPresentationStyle контроллера представления на .custom.

Вызовите метод present:animated:, чтобы представить контроллер представления.

Ссылки:

Документы Apple
Отличный пример от Raywenderlich

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...