Предпочитаемое игнорирование StatusBarUpdateAnimation

Я имею AuthViewController что представляет MainViewController вот так:

let mainVC = MainViewContoller()
mainVC.modalTransitionStyle = .CrossDissolve
authVC.presentViewController(mainVC, animated: true, completion: nil)

Я хочу AuthViewController чтобы скрыть строку состояния, но MainViewController показать, вот так:

AuthViewController {

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        return .Fade
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }
}

MainViewController {

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        return .Fade
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }
}

Строка состояния появляется, однако preferredStatusBarUpdateAnimation() переопределение игнорируется. Строка состояния отображается без анимации.

Я смог только оживить его, установив prefersStatusBarHidden на MainViewController в true до viewDidAppearзатем вызывая это:

UIView.animateWithDuration(0.3) {
    self.setNeedsStatusBarAppearanceUpdate()
}

Я не хочу называть это каждый раз. Что я делаю неправильно?

1 ответ

Искал решение этого тоже. Однако, похоже, вы уже получили половину решения. Вы должны установить переопределения для переменных, но для меня лучше всего было создать пару приватных переменных для каждого из переопределений, и чтобы каждое переопределение возвращало соответствующую приватную переменную (см. Ниже). Затем вы измените приватные переменные и вызовете setNeedsStatusBarAppearanceUpdate,

Плюс нужно установить View controller-based status bar appearance в вашем info.plist в YES, В противном случае он все равно будет опираться на наследие UIApplication.shared... методы.

Вот фрагмент:

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    get {
        return .slide
    }
}

private var statusBarStyle : UIStatusBarStyle = .default

override var preferredStatusBarStyle: UIStatusBarStyle {
    get {
        return statusBarStyle
    }
}

private var statusBarStatus : Bool = false

override var prefersStatusBarHidden: Bool {
    get {
        return statusBarStatus
    }
}

который я затем мог бы вызвать в функции следующим образом: (это один из моих примеров, поэтому не обращайте внимания на пользовательскую функцию).

func sliderView(sliderView: SliderView, didSlideToPlace: CGFloat, within: CGFloat) {

    let val = (within - (didSlideToPlace - sliderView.upCent))/(within)
    print(val)
    //Where you would change the private variable for the color, for example.
    if val > 0.5 {
        statusBarStyle = .lightContent
    } else {
        statusBarStyle = .default
    }
    UIView.animate(withDuration: 0.5, animations: {
        sliderView.top.backgroundColor = UIColor.black.withAlphaComponent(val)
        self.coverLayer.alpha = val
        self.scroll.backgroundColor = colors.lightBlueMainColor.withAlphaComponent(val)
    }, completion: {
        value in
        //If you do not call setNeedsStatusBarAppearanceUpdate() in an animation block, the animation variable won't be called it seems.
        UIView.animate(withDuration: 0.4, animations: {

            self.animating = true

            //Where you set the status for the bar (your part of the solution)
            self.statusBarStatus = false

            //Then you call for the refresh
            self.setNeedsStatusBarAppearanceUpdate()
        })
    })
}

В конечном итоге вам приходится настраивать каждый контроллер представления, но кажется, что это то, что вы хотите сделать, так что надеюсь, что это поможет!

Другие вопросы по тегам