好吧,我承认今天是凑数的。
来,上图,看gif。

这里的问题是,键盘回收后,莫名的在AlertView显示完后,再次弹出收回了。
为啥会有这个问题呢?代码如下,这里用的是UIAlertView(iOS9已经不用了,不过为了兼容iOS7,我们还是会用到的)。
textField.resignFirstResponder()
let alertView = UIAlertView.init(title: "Alert View", message: "test keyboard collapse", delegate: self, cancelButtonTitle: "cancel")
alertView.show()
键盘收回动画时长:0.25秒。
而这里我们在取消textfield的第一响应者之后,立刻弹出AlertView。相当于打断了键盘回收的动画。结果就是在AlertView完成后,又执行一边键盘收起的动画。
解决办法:
获取收回时间长度,延时该时长后,再弹出AlertView。
PS:相同的设定,用UIAlertController就不会有问题,不知道什么原因。
修正后的代码:
textField.resignFirstResponder()
//延时0.5秒
let time: NSTimeInterval = 0.5
let delay = dispatch_time(DISPATCH_TIME_NOW,
Int64(time * Double(NSEC_PER_SEC)))
dispatch_after(delay, dispatch_get_main_queue()) {
let alertView = UIAlertView.init(title: "Alert View",
message: "test keyboard collapse", delegate: self,
cancelButtonTitle: "cancel")
alertView.show()
}
获取键盘收回动画时长的方法:
通过通知UIKeyboardWillHideNotification,来获得键盘回收的信息。
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardHideAction:", name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardHideAction(noti: NSNotification) {
let userInfo = noti.userInfo
if let animationDuration = userInfo!["UIKeyboardAnimationDurationUserInfoKey"] {
print("\(animationDuration)")
}
}
键盘收回的几种方法:
- 取消textfield第一响应者
- 取消textfield所在的父视图的第一响应者
//取消textfield第一响应者
textField.resignFirstResponder()
//取消textfield所在的父视图的第一响应者
view.endEditing(true)
//通过UIApplication获取当前视图,然后取消第一响应者
UIApplication.sharedApplication().keyWindow?.endEditing(true)
彩蛋

我给Buuton添加了运行时属性,设定layer圆角。这里展示的是在XIB中设定运行时属性。
Demo地址见这里
网友评论