我正在使用UIView
的isHidden
属性来显示/隐藏我正在开发的发布界面上的控件。我使用它来更改键盘向上/向下时可用的控件,选择发布类型等。我编写了一个由通知触发的方法,用于设置视图属性(主要是.isHidden
)和动画更改,当键盘出现时调用,或者当用户选择一个帖子类型时,然后更改他们可用的控件。这通常工作得很好,并且属性按预期更改,但是当该方法被UIBarButton
操作触发时,被设置为可见的视图变得无响应。在点击bar按钮后,我无法更改视图的isHidden
属性(即使显式地将isHidden
设置为true或false.它也不会更改)。
下面是更改视图属性的方法:
@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
型
正如你在上面看到的,普通操作视图的isHidden
属性没有改变,即使它被设置为“false”。(虽然我认为这会导致nil引用,但我没有),所以我对normalActionView
和keyboardActionView
的引用很强。显然,这并没有解决问题,所以我把对isHidden
的更改放在一个通知调用的方法中,以确保它总是在同一个线程上(确实如此,我通过打印当前线程来检查,它总是main的),但这也没有帮助。
2条答案
按热度按时间xxslljrj1#
isHidden
的行为就像它是累积的。例如,如果您连续两次将其设置为true
,则需要将其设置为false
两次。我通常在设置值之前检查相反的值。
字符串
编辑
正如Yoel在评论中提到的,您可以使用
view.isHidden.toggle()
。但是,有时您需要确定将其设置为特定值,上面的技术将允许。
0vvn1miw2#
你为什么要把uiview动画绑定到键盘通知上?这是你的应用程序UI的一个必需部分吗?我认为你可以在按下一个按钮后激活你的视图。因为在任何视图上都很难捕捉到准确的键盘动画速度。我的意思是,当通知中心试图捕捉并激活视图时,键盘会快速关闭。
谢谢.