入力アクセサリビューの高さをアニメーション化するときに、私が異常な動作をしています。私は間違って何をしていますか?入力アクセサリビューの高さをアニメーション化するにはどうすればよいですか?
私はUIInputView
サブクラス(InputView
)を1つのサブビューで作成します。 InputView
とそのintrinsicContentSize
の高さは、サブビューによって制御されます。 isVisible
がの場合はInputView
は50ピクセル、高さが0の場合はisVisible
がfalseです。
import UIKit
class InputView: UIInputView {
private let someHeight: CGFloat = 50.0, zeroHeight: CGFloat = 0.0
private let subView = UIView()
private var hide: NSLayoutConstraint?, show: NSLayoutConstraint?
var isVisible: Bool {
get {
return show!.isActive
}
set {
// Always deactivate constraints before activating conflicting ones
if newValue == true {
hide?.isActive = false
show?.isActive = true
} else {
show?.isActive = false
hide?.isActive = true
}
}
}
// MARK: Sizing
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: size.width, height: someHeight)
}
override var intrinsicContentSize: CGSize {
return CGSize.init(width: bounds.size.width, height: subView.bounds.size.height)
}
// MARK: Initializers
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect, inputViewStyle: UIInputViewStyle) {
super.init(frame: frame, inputViewStyle: inputViewStyle)
addSubview(subView)
subView.backgroundColor = UIColor.purple
translatesAutoresizingMaskIntoConstraints = false
subView.translatesAutoresizingMaskIntoConstraints = false
subView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
subView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
subView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
subView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor).isActive = true
show = subView.heightAnchor.constraint(equalToConstant: someHeight)
hide = subView.heightAnchor.constraint(equalToConstant: zeroHeight)
hide?.isActive = true
}
}
ボタンが押されたときにホスト・ビュー・コントローラは、1秒のアニメーションブロック内isVisible
をトグルします。
import UIKit
class MainViewController: UIViewController {
let testInputView = InputView.init(frame: .zero, inputViewStyle: .default)
@IBAction func button(_ sender: AnyObject) {
UIView.animate(withDuration: 1.0) {
let isVisible = self.testInputView.isVisible
self.testInputView.isVisible = !isVisible
self.testInputView.layoutIfNeeded()
}
}
override var canBecomeFirstResponder: Bool {
return true
}
override var inputAccessoryView: UIView? {
return testInputView
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
Iが円滑isVisible
がtrue
に設定し、かつ円滑isVisible
がfalse
に設定されているときに、画面のボタンに縮小された画面のボタンから成長する入力アクセサリビューを期待。代わりにキーボードの背景オーバーレイは、isVisible
がtrue
で、入力アクセサリビューがそのフレームのセンターから成長するとすぐに、完全な50ピクセルの高さで表示されます。
縮小し、入力アクセサリビューは瞬時にスムーズにアニメーションを続行する前に、その高さの一部を失います。
この予期しない動作を表示するinput accessory view demonstration projectを作成しました。しかし、それはAppleがデザインを変更した場合、スーパーを呼び出すことをお勧めことはない
UIView.animate(withDuration: 1.0) {
let isVisible = self.testInputView.isVisible
self.testInputView.isVisible = !isVisible
self.testInputView.superview?.superview?.layoutIfNeeded()
}
:
私はこれを最善の答え*として受け入れていませんが、誰かがより安全な修正を明らかにすることを期待していますが、これは美しく機能します。スーパービューを見つける方法のヒントも非常に便利です。 –