斯威夫特:ScrollRectToVisible 不工作

Posted

技术标签:

【中文标题】斯威夫特:ScrollRectToVisible 不工作【英文标题】:Swift: ScrollRectToVisible not working 【发布时间】:2016-06-29 12:18:49 【问题描述】:

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

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

我正在处理一个注册屏幕,当它出现时,它在键盘后面有 1 个字段。

这是我的代码:

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, name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, 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 作为隐藏文本字段。

【问题讨论】:

使用 TPKeyboardAvoiding github.com/michaeltyson/TPKeyboardAvoiding。它超级简单,不,它会照顾好所有的。 @BharatModi,感谢您的评论。我不想使用 3rd 方 API,希望使用 Apple 推荐的方法。 【参考方案1】:

我也遇到了和你一样的问题,我不知道你是否成功并找到了解决方案,但我最终使用了 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)

【讨论】:

ScrollRectToVisible 工作了一段时间,我不确定我做了什么导致它停止,但这种方法解决了我的问题。谢谢!【参考方案2】:

SWIFT 4试试这个

scrollView.scrollRectToVisible(myElementView.frame, animated: true)

myElementView 可以是任何元素

【讨论】:

【参考方案3】:

您还应该将 scrollView 委托设置为:

self.scrollView.delegate = self as! UIScrollViewDelegate

ScrollView 委托方法适用于此。

【讨论】:

以上是关于斯威夫特:ScrollRectToVisible 不工作的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 contentInset 时,我不完全理解 scrollRectToVisible

scrollRectToVisible UITextField 不使用自动布局滚动

scrollRectToVisible 在页面视图控制器中不起作用 - iPhone sdks

斯威夫特:'!'的区别和 '?'迅速

又名 'NSString' 没有成员 - 斯威夫特

为啥 AVAudioPlayer var 等于 nil? - 斯威夫特