입력 액세서리보기 높이에 애니메이션을 적용 할 때 이상한 동작이 발생합니다. 내가 도대체 뭘 잘못하고있는 겁니까?입력 부속보기의 높이를 어떻게 애니메이트합니까?
하나의 하위보기가있는 UIInputView
하위 클래스 (InputView
)를 만듭니다. InputView
및 해당 intrinsicContentSize
의 높이는 하위 뷰에서 제어합니다. InputView
은 isVisible
이 true
일 때 높이가 50 픽셀이고 isVisible
이 거짓 일 때 높이가 0 픽셀입니다.
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()
}
}
나는 isVisible
이 true
로 설정되어있을 때 입력 액세서리보기가 원활하게 화면의 botton을에서 성장을 기대하고 isVisible
이 false
로 설정되어있을 때 부드럽게 화면의 버튼으로 축소. 대신 키보드 백그라운드 오버레이는 isVisible
이 true
이고 입력 액세서리보기가 해당 프레임의 센터에서 커지면 전체 50 픽셀 높이로 나타납니다.
축소, 입력 액세서리보기는 즉시 부드럽게 애니메이션을 계속하기 전에 높이의 일부를 잃는다.
나는이 예기치 않은 동작을 나타내는 input accessory view demonstration project을 만들었습니다.
UIView.animate(withDuration: 1.0) {
let isVisible = self.testInputView.isVisible
self.testInputView.isVisible = !isVisible
self.testInputView.superview?.superview?.layoutIfNeeded()
}
그러나, 애플이 디자인을 변경하는 경우 수퍼를 호출하는 것이 좋습니다는 결코 :
더 안전한 해결책을 밝히기를 바라는 최고의 답 *으로 받아들이지 않겠지 만,이 방법은 아름답게 작동합니다. 슈퍼 뷰를 찾는 방법에 대한 팁 또한 매우 유용합니다. –