我一直在尝试添加一些代码来在键盘出现时移动我的视图,但是,我在尝试将Objective-C示例转换为Swift时遇到了问题 . 我已经取得了一些进展,但我被困在一条特定的路线上 .
这些是我一直关注的两个教程/问题:
How to move content of UIViewController upwards as Keypad appears using Swift http://www.ioscreator.com/tutorials/move-view-when-keyboard-appears
这是我目前的代码:
override func viewWillAppear(animated: Bool) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func keyboardWillShow(notification: NSNotification) {
var keyboardSize = notification.userInfo(valueForKey(UIKeyboardFrameBeginUserInfoKey))
UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
let frame = self.budgetEntryView.frame
frame.origin.y = frame.origin.y - keyboardSize
self.budgetEntryView.frame = frame
}
func keyboardWillHide(notification: NSNotification) {
//
}
目前,我在这一行收到错误:
var keyboardSize = notification.userInfo(valueForKey(UIKeyboardFrameBeginUserInfoKey))
如果有人能让我知道这行代码应该是什么,我应该设法自己弄清楚其余部分 .
10 回答
这对我有帮助:https://developer.apple.com/library/ios/samplecode/UICatalog/Listings/Swift_UICatalog_TextViewController_swift.html
您的 生产环境 线存在一些问题
notification.userInfo
返回一个可选字典[NSObject : AnyObject]?
,因此必须在访问其值之前将其解包 .Objective-C
NSDictionary
映射到Swift本机字典,因此必须使用字典下标语法(dict[key]
)来访问值 .必须将值强制转换为
NSValue
,以便可以在其上调用CGRectValue
.所有这些都可以通过可选赋值,可选链接和可选转换的组合来实现:
或者一步到位:
Update for Swift 3.0.1 (Xcode 8.1):
或者一步到位:
对于更少的代码,请考虑查看THIS
这对我真的很有帮助 . 您只需在视图控制器中包含视图约束并使用您添加的两个观察者 . 然后只需使用以下方法(这里假设你移动一个tableView)
和
如果您使用的是故事板,而不是操纵视图本身,则可以利用自动布局 .
(这是尼古拉斯答案的清理版)
设置通知中心以通知您键盘的外观和消失:
并确保在不再需要时删除观察者:
在故事板内部,设置底部约束 . 创建该约束的出口:
并在显示或隐藏键盘时设置约束的常量属性:
现在,只要键盘出现或消失,自动布局就会照顾好一切 .
Swift 2
Swift 3
您可以将这一行用于您的 生产环境 线
Swift 3: UPDATE
Swift 3.0
这是一个检索键盘大小并使用它来向上动画视图的示例 . 在我的情况下,当用户开始输入时,我正在向上移动包含我的UITextFields的UIView,这样他们就可以完成一个表单并仍然可以看到底部的提交按钮 .
我添加了一个出口到我想要动画的视图的底部空间约束,并将其命名为
myViewsBottomSpaceConstraint
:然后我将以下代码添加到我的swift类中:
详情
xCode 8.2.1,swift 3
代码
用法
完整样本
结果
日志
对于xamarin,您可以使用c#6
C#7