在Facebook Messenger for iOS上,它有它,所以如果键盘被隐藏,如果你向上滑动,键盘将显示。它与交互式键盘解雇模式完全相反:键盘以您向上滑动的速度向上滑动时显示自己。
有人对如何做到这一点有任何指示吗?
编辑:谢谢你的答案!因为我看到它是在Facebook Messenger中完成的,所以我主要考虑是否有内置的方法来做到这一点。但是,我刚读了一篇博文,他们说他们必须截取系统键盘以获得效果 - 所以我假设没有内置的方法来做到这一点!正如评论中所提到的,我正在使用自定义键盘,所以这应该更容易,因为我可以控制框架!
答案 0 :(得分:4)
基本上你需要UIPanGestureRecognizer。
为底边设置UIScreenEdgePanGestureRecognizer,UIPanGestureRecognizer用于在Storyboard中隐藏键盘并将@IBAction出口拖到代码中。
使用键盘在Storyboard的控制器底部设置键盘视图容器,以便用户看不到它。将@IBOutlet拖到您的代码中,这样您就可以修改它的框架。
在拖动动画视图移动时的手势动作中。
当停止拖动时,您需要检查视图的位置并将其设置为目标,如果它还没有。
此外,您还需要为拖动区域添加一项检查,以便用户无法进一步拖动它。
这很简单,您只需要检查所有案例并进行正确测试。
这是您可以使用此构建的基本设置:
class ViewController: UIViewController {
@IBOutlet weak var keyboardContainerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func onEdgePanGestureDrag(_ sender: UIScreenEdgePanGestureRecognizer) {
let point = sender.location(in: view)
view.layoutIfNeeded()
UIView.animate(withDuration: 0.33) {
// Animate your custom keyboard view's position
self.keyboardContainerView.frame = CGRect(x: self.keyboardContainerView.bounds.origin.x,
y: point.y,
width: self.keyboardContainerView.bounds.width,
height: self.keyboardContainerView.bounds.height)
}
view.layoutIfNeeded()
}
@IBAction func onPanGestureDrag(_ sender: UIPanGestureRecognizer) {
let point = sender.location(in: view)
view.layoutIfNeeded()
UIView.animate(withDuration: 0.33) {
// Animate your custom keyboard view's position
self.keyboardContainerView.frame = CGRect(x: self.keyboardContainerView.bounds.origin.x,
y: point.y,
width: self.keyboardContainerView.bounds.width,
height: self.keyboardContainerView.bounds.height)
}
view.layoutIfNeeded()
}
}
答案 1 :(得分:1)
这是对我有用的实现。它不是完美的,但是效果很好并且易于实现。您将需要一个集合视图或一个表视图。
为简单起见,我将仅显示此功能所需的代码。因此,请处理视图初始化所需的所有其他内容。
class ViewController: UIViewController {
var collectionView: UICollectionView!
var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.panGestureRecognizer.addTarget(self, action: #selector(handlePan(_:)))
collectionView.keyboardDismissMode = .interactive
// Only necessary for empty collectionView
collectionView.alwaysBounceVertical = true
}
func handlePan(_ sender: UIPanGestureRecognizer) {
if sender.state == .changed {
let translation = sender.translation(in: view)
if translation.y < 0 && collectionView.isAtBottom && !self.textView.isFirstResponder() {
self.textView.becomeFirstResponder()
}
}
}
}
extension UIScrollView {
var isAtBottom: Bool {
return contentOffset.y >= verticalOffsetForBottom
}
var verticalOffsetForBottom: CGFloat {
let scrollViewHeight = bounds.height
let scrollContentSizeHeight = contentSize.height
let bottomInset = contentInset.bottom
let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight
return scrollViewBottomOffset
}
}