Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图
Posted
技术标签:
【中文标题】Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图【英文标题】:Swift: Scroll View only when a TextField or Button is hidden by the Keyboard 【发布时间】:2015-08-18 04:04:53 【问题描述】:下面是我尝试使用的代码,仅当键盘隐藏焦点文本字段或 UIButton 时,视图才会滚动:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate
@IBOutlet weak var buttonToBottomConstraint: NSLayoutConstraint!
@IBOutlet weak var textFieldUsername: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad()
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil)
func textFieldDidBeginEditing(textField: UITextField)
func textFieldShouldReturn(textField: UITextField) -> Bool textField.resignFirstResponder()
return true
func keyboardWillBeHidden(notification: NSNotification)
self.scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
func keyboardWillBeShown(notification: NSNotification)
let userInfo = notification.userInfo!
if let kbsize = userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size
self.scrollView .setContentOffset(CGPointMake(0, kbsize.or), animated: true)
问题:即使键盘没有隐藏任何内容,视图也会滚动。
在发布时查看:
点击文本字段时查看:
问题:我如何检查焦点区域是否被键盘隐藏,如果是,则将其推到它上方?
项目:TextFieldScroll
编辑
应用在纵向模式下运行良好,但在横向模式下却不行。同样在横向模式下,当用户名文本字段键盘打开并点击密码文本字段时,它仍然隐藏在键盘后面。我在 Github 上更新了项目并修复了链接。谢谢
横向屏幕截图:
【问题讨论】:
【参考方案1】:var currentTextField:UITextField?
@IBOutlet weak var textFieldUsername: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad()
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil)
func textFieldDidBeginEditing(textField: UITextField)
currentTextField=textField;
func textFieldShouldReturn(textField: UITextField) -> Bool
textField.resignFirstResponder()
return true
func keyboardWillBeHidden(notification: NSNotification)
currentTextField=nil;
self.scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
func keyboardWillBeShown(notification: NSNotification)
let userInfo = notification.userInfo!
if let kbsize = userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: kbsize.height, right: 0)
let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenHeight = screenSize.height
let height:CGFloat=screenHeight-(kbsize.height)-(currentTextField!.frame.size.width)
if(currentTextField!.frame.origin.y>=height )
var scrollPoint: CGPoint = CGPointMake(0.0, currentTextField!.frame.origin.y - (kbsize.height));
self.scrollView .setContentOffset(scrollPoint, animated: true)
func textFieldDidEndEditing(textField: UITextField)
currentTextField=nil;
【讨论】:
谢谢。我会在早上试试这个,然后告诉你。 嘿,我在横向模式下仍然遇到问题。我更新了问题。不过我确实取得了进展,谢谢。【参考方案2】:我没有看到你设置scrollView
的contentSize
。因此,scrollView
会随着键盘滚动,因为它使用屏幕的大小。
【讨论】:
内容大小应该是多少?或者我应该在哪里设置? 当您使用UIScrollView
时,您需要告诉它您的内容有多大。您应该设置它的contentSize
以尽快告诉它(例如viewDidLoad
或didSet
)。你需要传入一个CGSize
,它接受宽度和高度。宽度将是视图控制器的宽度,高度将是徽标的高度+标签+文本字段+按钮+中间的空间。
谢谢。当我在 viewDidLoad
中添加内容大小时,什么也没有发生
我添加了下面这行self.scrollView.contentSize = CGSize(width: self.view.frame.width, height: CGFloat(400))
,结果和第二张图一样。
另外,我用IB添加了scrollView
,它覆盖了整个屏幕。以上是关于Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义 uitableViewCell 按下回车键或单击 uitableView 时隐藏键盘