ios - 键盘打开时以编程方式提升 UI 文本字段

标签 ios swift

这是我当前的代码,它可以工作,但是在较小的设备上,字段会移动到用户显示上方。我如何编辑它以确保这些字段不会对用户隐藏?我从 gregbarbosa 的 tut 中窃取了一些代码,因此带答案的解释会很有帮助。谢谢。

import UIKit

class LoginViewController: UIViewController {

//MARK: Storyboard
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var teamID: UITextField!
@IBOutlet weak var scoutID: UITextField!
@IBOutlet weak var pinNum: UITextField!
@IBOutlet weak var signin: UIButton!
@IBOutlet weak var diamondPic: UIImageView!
@IBOutlet weak var nodextext: UILabel!
@IBOutlet weak var loginB: UIButton!
@IBOutlet weak var moverL: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")

    // prevents the scroll view from swallowing up the touch event of child buttons
    tapGesture.cancelsTouchesInView = false

    scrollView.addGestureRecognizer(tapGesture)

}

@IBAction func loginTapped(sender: UIButton) {
    var userDefaults = NSUserDefaults.standardUserDefaults()
    var secretKey = userDefaults.stringForKey("secretkey")
    var team:String = teamID.text
    var scout:String = scoutID.text
    var password:String = pinNum.text


    var loginQuery = PFQuery(className:"User")
    loginQuery.whereKey("teamID", equalTo:team)
    loginQuery.whereKey("scoutID", equalTo:scout)
    loginQuery.whereKey("password", equalTo:password)
    loginQuery.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil && objects.count != 0 {
            self.performSegueWithIdentifier("SecondViewController", sender: self)
        } else if error == nil && objects.count == 0{
            var alert : UIAlertView = UIAlertView(title: "Login Error", message: "Your TeamID, ScoutID, or Password is inncorrect.",       delegate: nil, cancelButtonTitle: "Ok")

            alert.show()

        } else {
            // Log details of the failure
            NSLog("Error: %@ %@", error, error.userInfo!)
        }
    }
}
@IBOutlet weak var loginTapped: UIButton!


override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)
    self.registerForKeyboardNotifications()

}

override func viewWillDisappear(animated: Bool) {
    self.deregisterFromKeyboardNotifications()
    super.viewWillDisappear(true)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

func registerForKeyboardNotifications() -> Void {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)

}

func deregisterFromKeyboardNotifications() -> Void {
    println("Deregistering!")
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidHideNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillHideNotification, object: nil)

}

func keyboardWasShown(notification: NSNotification) {
    var info: Dictionary = notification.userInfo!
    var keyboardSize: CGSize = (info[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size)!
    var buttonOrigin: CGPoint = self.loginB.frame.origin;
    var buttonHeight: CGFloat = self.loginB.frame.size.height;
    var visibleRect: CGRect = self.view.frame
    visibleRect.size.height -= keyboardSize.height

    if (!CGRectContainsPoint(visibleRect, buttonOrigin)) {
        var scrollPoint: CGPoint = CGPointMake(0.0, buttonOrigin.y - visibleRect.size.height + buttonHeight + 4)
        self.scrollView.setContentOffset(scrollPoint, animated: true)

    }
    nodextext.hidden = true
    diamondPic.hidden = true
}

func hideKeyboard() {
    teamID.resignFirstResponder()   //FirstResponder's must be resigned for hiding keyboard.
    scoutID.resignFirstResponder()
    pinNum.resignFirstResponder()
    self.scrollView.setContentOffset(CGPointZero, animated: true)
    diamondPic.hidden = false
    nodextext.hidden = false
}

}

先谢谢你。

最佳答案

有几种方法可以做到这一点。首先,当 UI 元素成为第一响应者时,您可以手动更改 ScrollView 的内容偏移量。您可以使用 UITextFieldDelegatetextFieldDidBeginEditing: 方法进行检查。这通常被证明是困难的。另一件事是将所有 UI 元素放在 TableView 中,并在文本字段等 UIElement 成为第一响应者时调用 scrollToRowAtIndexPath:atScrollPosition:animated:

关于ios - 键盘打开时以编程方式提升 UI 文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180899/

相关文章:

ios - 如何让多个UIImage同时受重力下落?

ios - 我如何获取用户的当前位置,执行本地地理查询,然后将结果应用到 PFQueryTableViewController?

iOS用UICollectionView如何实现这种布局

ios - Alamofire:文件下载和验证失败

ios - 为什么 iOS UIWebView 的 loadRequest 方法没有返回值?

if-statement - 在 Swift 的 if 语句中使用 let

ios - UIImageView 不会动画,只有静态图像

ios - 以编程方式快速创建动态高度 UIImageViews

ios - 检测附近的用户并通过推送通知 iOS 进行通知

ios - 在 swift ios 中使用 webkitview