Swift:仅在键盘隐藏TextField或Button时滚动查看 [英] Swift: Scroll View only when a TextField or Button is hidden by the Keyboard

查看:212
本文介绍了Swift:仅在键盘隐藏TextField或Button时滚动查看的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是我试图使用的代码,只有在键盘隐藏了聚焦的textField或UIButton时才能滚动视图:

  import UIKit 

class ViewController:UIViewController,UITextFieldDelegate {

@IBOutlet weak var buttonToBottomConstraint:NSLayoutConstraint!

@IBOutlet weak var textFieldUsername:UITextField!
@IBOutlet weak var textFieldPassword:UITextField!
@IBOutlet弱var scrollView:UIScrollView!


覆盖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()

返回true
}

func keyboardWillBeHidden(通知:NSNotification){

self.scrollView。 setContentOffset(CGPointMake(0,0),animated:true)
}

func keyboardWillBeShown(通知:NSNotification){

let userInfo = notification.userInfo!

如果让kbsize = userInfo [UIKeyboardFrameBeginUserInfoKey] ?. CGRectValue()。size {

self.scrollView .setContentOffset(CGPointMake(0,kbsize.or),animated:true )
}
}
}

问题:视图滚动即使键盘没有隐藏任何东西。



启动时查看:





点击TextField时查看:





问题:如何检查键盘是否隐藏了聚焦区域,如果是,请将其推到上方?



项目:

解决方案

  var currentTextField:UITextField? 

@IBOutlet weak var textFieldUsername:UITextField!
@IBOutlet weak var textFieldPassword:UITextField!
@IBOutlet弱var scrollView:UIScrollView!


覆盖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()

返回true
}

func keyboardWillBeHidden(通知:NSNotification){
currentTextField = nil;
self.scrollView.setContentOffset(CGPointMake(0,0),animated:true)
}

func keyboardWillBeShown(通知:NSNotification){

让userInfo = notification.userInfo!

如果让kbsize = userInfo [UIKeyboardFrameBeginUserInfoKey] ?. CGRectValue()。size
{
let contentInsets = UIEdgeInsets(top:0,left:0,bottom:kbsize.height ,右:0)
让screenSize:CGRect = UIScreen.mainScreen()。bounds
让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;
}


Below is the code that I'm trying to use to have the view scroll only when the focused textField or UIButton is hidden by the keyboard:

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)
        }
    }
}

Problem: The View scrolls even when the keyboard is not hiding anything.

View at Launch:

View Upon Tapping on a TextField:

Question: How do I check to see if the focused field is hidden by the keyboard, and ONLY if it is, push it above it?

Project: TextFieldScroll

EDIT

App works fine in Portrait mode, however, not in landscape mode. Also in landscape mode, when the Username textField keyboard is up and I tap the Password textField, it remains hidden behind the keyboard. I updated the project on Github and fixed the link. Thanks

Screen shot in landscape:

解决方案

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;
   }

这篇关于Swift:仅在键盘隐藏TextField或Button时滚动查看的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆