Как сделать прокрутку scrollView, только если клавиатура появляется в Swift - PullRequest
1 голос
/ 06 ноября 2019

Я использую scrolview для вида с высотой 1000, изначально я не хочу, чтобы мой scrolView прокручивался. если я нажимаю на любое текстовое поле, тогда я хочу, чтобы прокрутка прокручивалась, а если я возвращаю клавиатуру, я не хочу, чтобы прокрутка прокручивалась.

Здесь я могу увеличить текстовое поле, когда появляется клавиатура, но не могучтобы вернуть текстовое поле в его исходное положение, когда я возвращаю клавиатуру и когда я возвращаю клавиатуру, я не хочу, чтобы мое представление прокручивалось,

Пожалуйста, помогите мне в коде.

class ViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var scrolView: UIScrollView!
@IBOutlet weak var upTFLD: UITextField!
var activeTextField = UITextField()

@IBOutlet weak var downTFLD: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    upTFLD.delegate = self
    downTFLD.delegate = self

    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardAppear(_:)), name: UIResponder.keyboardDidShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisappear(_:)), name: UIResponder.keyboardDidHideNotification, object: nil)
}
@objc func onKeyboardAppear(_ notification: NSNotification) {

    let info = notification.userInfo!
    let rect: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as! CGRect
    let kbSize = rect.size
    let insets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height+20, right: 0)
    self.scrolView.contentInset = insets
    self.scrolView.scrollIndicatorInsets = insets
    var visibleRect: CGRect = self.scrolView.convert(self.scrolView.bounds, to: self.view)
    visibleRect.size.height -= rect.size.height;
    let inputRect: CGRect = self.activeTextField.convert(self.activeTextField.bounds, to: self.scrolView)
    if (visibleRect.contains(inputRect)) {
        self.scrolView.scrollRectToVisible(inputRect, animated: true)
    }
}

@objc func onKeyboardDisappear(_ notification: NSNotification) {

    self.scrolView.contentInset = UIEdgeInsets.zero
    self.scrolView.scrollIndicatorInsets = UIEdgeInsets.zero
}

public func textFieldDidBeginEditing(_ textField: UITextField) {

    activeTextField = textField
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    activeTextField.resignFirstResponder()
    return true
}
}

изначально я не хочупрокрутка, и если я верну клавиатуру, мне нужно, чтобы текстовое поле вернулось в исходное положение и больше не прокручивать.

Появляется только клавиатура, только мне нужна прокрутка. пожалуйста, помогите мне в коде.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вам просто нужно установить contentOffset вашего ScrollView сразу после того, как клавиатура скрыта.

Создать переменную для хранения offsetBeforeShowKeyboard

var offsetBeforeShowKeyboard: CGFloat?

Когда представление загружается изначально:

self.scrollView.isScrollEnabled = false

При выборе любого TextField:

public func textFieldDidBeginEditing(_ textField: UITextField) {
    self.scrollView.isScrollEnabled = true
    if (self.offsetBeforeShowKeyboard == nil) {
        self.offsetBeforeShowKeyboard = self.scrollView.contentOffset
    }
 }

Когда клавиатура скрыта

 @objc func onKeyboardDisappear(_ notification: NSNotification) {
    self.scrollView.isScrollEnabled = false
    if let offset = self.offsetBeforeShowKeyboard {
        self.scrolView.setContentOffset(offset, animated: true)    
    }
    self.offsetBeforeShowKeyboard = nil
 }
1 голос
/ 06 ноября 2019

В viewWillAppear

 yourScrollview.isScrollEnabled = false

После появления клавиатуры сделайте ее true

 yourScrollview.isScrollEnabled = true

В качестве альтернативы вы можете использовать диспетчер IQKeyboard для работы с текстовыми полями. Проверка: IQKeyboardManager

...