UIBarButton

时间:2019-07-01 05:46:25

标签: ios swift xcode

我正在使用UIView的{​​{1}}属性在我正在开发的发布界面上显示/隐藏控件。我使用它来更改键盘上/下,选择帖子类型等时可用的控件。我编写了一种由通知触发的方法,该方法设置视图属性(主要是isHidden)并为更改添加动画效果,即当键盘出现或用户选择帖子类型,然后更改其可用控件时调用。这通常可以正常工作,并且属性会按预期进行更改,但是当方法由.isHidden动作触发时,设置为可见的视图将变得无响应。按下条形按钮后,我无法更改视图的UIBarButton属性(即使将isHidden显式设置为true或false ...也不会更改)。

这是更改视图属性的方法:

isHidden

@objc func animateActionViewChange(_ sender: Notification) { // DEBUG print("\n[BEFORE]\nnormalActionView.isHidden: \(normalActionView.isHidden)\nkeyboardActionView.isHidden: \(keyboardActionView.isHidden)\nkeyboardUp: \(keyboardUp)\nactionViewActive: \(actionViewActive)") // save prev state let normalTemp: Bool = normalActionView.isHidden let keyboardTemp: Bool = keyboardActionView.isHidden // set new state based on env vars normalActionView.isHidden = keyboardUp ? true : !actionViewActive keyboardActionView.isHidden = keyboardUp ? !actionViewActive : true // DEBUG print("[AFTER]\nnormalActionView.isHidden: \(normalActionView.isHidden)\nkeyboardActionView.isHidden: \(keyboardActionView.isHidden)\nkeyboardUp: \(keyboardUp)\nactionViewActive: \(actionViewActive)") // animate opacity changes if normalActionView.isHidden != normalTemp { let targetAlpha: CGFloat = normalTemp ? CGFloat(1) : CGFloat(0) UIView.animate(withDuration: actionViewAnimationDuration / 2) { self.normalActionView.alpha = targetAlpha } } if keyboardActionView.isHidden != keyboardTemp { let targetAlpha: CGFloat = keyboardTemp ? CGFloat(1) : CGFloat(0) UIView.animate(withDuration: actionViewAnimationDuration / 2) { self.keyboardActionView.alpha = targetAlpha } } } 调用的操作(此问题与按钮标题为“后退”时的情况有关):

UIBarButton

以下是点击“后退”按钮之前调试标志的输出:

// back/cancel button action
    @IBAction func cancel(sender: UIBarButtonItem) {
        if sender.title == "Cancel" {
            // cancel ongoing request if there is one
            if let request = ongoingRequest {
                if !request.isFinished {
                    request.cancel()
                }
            }

            self.performSegue(withIdentifier: "cancel_unwindFromNewPostView", sender: self)
        } else {
            // reset post type to default (general)
            postType = .general

            // set actionViewActive bool to set visibility going forwards
            actionViewActive = true

            // hide datePicker
            self.datePickerView.isHidden = true

            actionViewAnimationDuration = 0.35
            NotificationCenter.default.post(name: NSNotification.Name("animateActionViewChange"), object: nil)

            UIView.animate(withDuration: 0.35) {
                // layout
                self.view.layoutIfNeeded()
            }

            // revert button text to 'cancel'
            cancelButton.title = "Cancel"
        }
    }

之后:

[BEFORE]
normalActionView.isHidden: false
keyboardActionView.isHidden: true
keyboardUp: true
actionViewActive: true
[AFTER]
normalActionView.isHidden: true
keyboardActionView.isHidden: false
keyboardUp: true
actionViewActive: true

正如您在上面看到的那样,即使将常规操作视图的[BEFORE] normalActionView.isHidden: true keyboardActionView.isHidden: true keyboardUp: false actionViewActive: true [AFTER] normalActionView.isHidden: true keyboardActionView.isHidden: true keyboardUp: false actionViewActive: true 属性设置为“ false”,也不会更改。我原本以为这是因为某处丢失了一个引用(尽管我认为这会导致零引用,但我没有),所以我将对isHiddennormalActionView的引用设为强。显然,这并不能解决问题,因此我将更改keyboardActionView放入了通知所调用的方法中,以确保它始终位于同一线程上(即,我通过打印当前线程进行检查,始终是主要的),但这也无济于事。

2 个答案:

答案 0 :(得分:0)

为什么将uiview动画绑定到键盘通知?那是应用程序用户界面的必需部分吗?我认为您可以在按下按钮后为视图添加动画。因为很难同时捕获精确的键盘动画速度和任何视图。我的意思是,通知中心尝试捕获视图并为其设置动画时,键盘会快速关闭。

谢谢。

答案 1 :(得分:0)

isHidden是累积的。例如,如果您连续两次将其设置为true,则需要两次将其设置为false

我通常在设置值之前先检查相反的值。

if view.isHidden == false {
    view.isHidden = true 
}