Как сдвинуть ячейки вверх после отображения pickerView

52
7

У меня есть tableView с некоторыми значениями из массива, и когда я звоню в ячейку, он должен отображать pickerView. Это работает хорошо, но когда я нажимаю на последнюю ячейку и отображается pickerView, он охватывает последние несколько ячеек. Я хотел бы сдвинуть ячейки, как только pickerView будет отображаться, чтобы не покрывать ячейки, чтобы пользователь мог видеть ячейки (что-то вроде приложения Apple Health при нажатии на некоторые параметры).

Пример приложения Apple Health App gif для отображения запрашиваемого состояния

Текущее поведение приложения

import UIKit

class MoreTableVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var tableView: UITableView!

var pickerView: UIPickerView!

let mainLblArr = ["Afghanistan", "Åland Islands", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua & Barbuda", "Argentina", "Armenia", "Aruba", "Ascension Island", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh"]
let detailLblArr = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]

var pickerArr = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]

override func viewDidLoad() {
super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self

pickerView = UIPickerView()

pickerView.delegate = self
pickerView.dataSource = self

}

// MARk: TableView functions
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return mainLblArr.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "ProtoCell") as? MoreCustomCell {

cell.mainLbl.text = mainLblArr[indexPath.row]
cell.detailLbl.text = detailLblArr[indexPath.row]

return cell

} else {

return UITableViewCell()
}
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

// Set the position of where the picker should appear to bottom of the screen
pickerView.frame = CGRect(x: 0, y: view.frame.size.height - 200, width: self.view.frame.width, height: 200)

// Apply transformation to the view that will make it slide from the bottom
pickerView.transform = CGAffineTransform(translationX: 0, y: 200)

pickerView.backgroundColor = UIColor.lightGray

// Move the pickerView which contains picker to the subView and show it on the screen
view.addSubview(pickerView)

// Animates the view
UIView.animate(withDuration: 0.3, animations: {
self.pickerView.transform = .identity
})
}

// MARK: PickerView functions

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerArr[row]
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerArr.count
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerView.removeFromSuperview()
}

}

Заранее спасибо! Любая помощь высоко ценится!

спросил(а) 2020-03-25T19:18:49+03:00 1 неделя, 4 дня назад
1
1 ответ
-4

Не добавляйте pickerView как subview с использованием фреймов. Лучшее решение. Вы можете добавить представление выбора в виде клавиатуры, а не зарегистрироваться для уведомления, когда клавиатура показывает и перемещать scrollView - также она может управляться автоматически с помощью потрясающей библиотеки IQKeyboardManager. Вы получите сборщик, показывающий анимацию бесплатно.

Я искал его, и вот первый учебник, который я нашел: https://blog.apoorvmote.com/uipickerview-as-inputview-to-uitextfield-in-swift/

ответил(а) 2020-03-25T19:33:35.172036+03:00 1 неделя, 4 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема