2015-01-27 5 views
0

Вот мой текущий код, и он работает, однако на небольших устройствах поля перемещаются над дисплеем пользователей. Как я могу отредактировать это, чтобы убедиться, что поля не скрываются от пользователя? Я украл часть этого кода от tut от gregbarbosa, поэтому объяснение с ответом очень помогло бы. Спасибо.Программно поднять текстовые поля пользовательского интерфейса при открытии клавиатуры

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 
} 

} 

Благодарим вас за продвижение.

ответ

1

Есть несколько способов сделать это. Во-первых, вы можете изменить смещение содержимого вида прокрутки вручную, когда элемент пользовательского интерфейса станет первым ответчиком. Вы можете проверить это, используя UITextFieldDelegate и метод textFieldDidBeginEditing:. Это часто оказывается трудным. Другое дело - поместить все элементы пользовательского интерфейса в виде таблицы и вызвать scrollToRowAtIndexPath:atScrollPosition:animated:, когда UIElement, такой как текстовое поле, становится первым ответчиком.

+0

Если я решил использовать вид таблицы, будет он выглядит как стол, или я могу его стиль выглядеть немного более удобным для пользователя? –

+0

Вы можете стилизовать его, как хотите. Использование статических ячеек проектирует ваш пользовательский интерфейс (если вы не хотите, чтобы он был динамичным, конечно). Вы можете отключить разделители ячеек и сделать его похожим на нормальный вид. – Ian

+0

Существуют также другие расширения, которые делают это, если вы немного ищете Интернет – Ian

1

Я думаю, что лучший способ, чтобы скрыть клавиатуру, чтобы добавить resignFirstResponder (или вызвать ваш hideKeyboard) в методе делегата Scrollview:

func scrollViewWillBeginDragging(scrollView: UIScrollView) 

Надеется, что это помогает

Смежные вопросы