ios – Swift:ScrollRectToVisible不工作

在尝试了这里发布的大多数解决方案后,我仍然无法移动文本字段以在滚动视图中显示在键盘上方.

这些是我从Stackoverflow解决方案中获得的链接:
Link 1
Link 2
Link 3

我正在进行一个注册屏幕,当它出现时,键盘后面有一个字段.

这是我的代码:

class SignUpViewController: UIViewController,UITextFieldDelegate,UIScrollViewDelegate,UIPopoverPresentationControllerDelegate {

@IBOutlet var firstNameTextField: UITextField!
@IBOutlet var lastNameTextField: UITextField!
@IBOutlet var phoneNumberTextField: UITextField!
@IBOutlet var emailTextField: UITextField!
@IBOutlet var submitButton: UIButton!
@IBOutlet var professionButton: UIButton!

var scrollView: UIScrollView?
var activeTextField:UITextField? = UITextField()

override func viewDidLoad() {
    super.viewDidLoad()

    let notificationCenter = NSNotificationCenter.defaultCenter()

    notificationCenter.addObserver(self,selector: #selector(SignUpViewController.keyboardWasShown(_:)),name: UIKeyboardWillShowNotification,object: nil)
    notificationCenter.addObserver(self,selector: #selector(SignUpViewController.keyboardWillBeHidden(_:)),name: UIKeyboardWillHideNotification,object: nil)
    scrollView = UIScrollView(frame: CGRect(x: 0,y: 0,width: self.view.frame.size.width,height: self.view.frame.size.height))
    scrollView!.contentSize = CGSizeMake(self.view.frame.width,self.view.frame.height)

    defaultSettings()
}

func defaultSettings() {
    self.firstNameTextField.delegate = self
    self.lastNameTextField.delegate = self
    self.emailTextField.delegate = self
    self.phoneNumberTextField.delegate = self
}

func deregisterFromKeyboardNotifications()
{
    //Removing notifies on keyboard appearing
    NSNotificationCenter.defaultCenter().removeObserver(self,object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self,object: nil)
}

func keyboardWasShown(notification: NSNotification)
{
    //Need to calculate keyboard exact size due to Apple suggestions
    //self.scrollView!.scrollEnabled = true
    var info : NSDictionary = notification.userInfo!
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
    var contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0,0.0,keyboardSize!.height,0.0)

    self.scrollView!.contentInset = contentInsets
    self.scrollView!.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if (!CGRectContainsPoint(aRect,activeTextField!.frame.origin))
    {
//            print(activeTextField?.frame)
//            var scrollPoint = CGPointMake(0.0,activeTextField!.frame.origin.y - (keyboardSize!.height-15))
        self.scrollView!.scrollRectToVisible((activeTextField?.frame)!,animated: true)
        //self.scrollView?.setContentOffset(scrollPoint,animated: true)
    }
}


func keyboardWillBeHidden(notification: NSNotification)
{
    //Once keyboard disappears,restore original positions
    //var info : NSDictionary = notification.userInfo!
    //var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
    var contentInsets : UIEdgeInsets = UIEdgeInsetsZero
    self.scrollView!.contentInset = contentInsets
    self.scrollView!.scrollIndicatorInsets = contentInsets
//        self.view.endEditing(true)
//        self.scrollView!.scrollEnabled = false

}

func textFieldDidBeginEditing(textField: UITextField)
{
    activeTextField = textField
}

func textFieldDidEndEditing(textField: UITextField)
{
    activeTextField = nil
}

正如您所看到的,我已尝试使用frame的scrollRectToVisible和使用Point的setContentOffset.两者都没用.而代码选中emailTextField作为隐藏文本字段.

解决方法

我也在努力解决同样的问题,我不知道你是否成功并找到了解决方案,但我最终使用了setContentOffset函数而不是scrollRectToVisible而且它有效.

Swift 3.x示例:

if (!aRect.contains(activeTextView!.frame.origin)) {
                self.scrollView.setContentOffset(CGPoint(x:0,y:self.activeTextView!.frame.origin.y),animated: true)
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...