ScrollView и contentInset


#1

День добрый.
По недавней копошилке начал делать клавиатуру.

func kbWillShow(_ notification: Notification) {
    let kbFrameSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
   // scrollView.contentOffset = CGPoint(x: 0, y: kbFrameSize.height)
    scrollView.contentInset = UIEdgeInsetsMake(0, 0, kbFrameSize.height+40, 0)
}

func kbWillHide() {
    scrollView.contentInset = UIEdgeInsets.zero
    //       scrollView.contentOffset = CGPoint(x: 0, y: -64)
}

Картинка справа - то что ожидаю.
Картинка слева - то что получаю.

Смысл в том, что под клавиатурой прячется кнопка (“КНОПИЩЕ”) добавления новой строки, я хочу чтобы эта кнопка была видна.
Пирог:
-ViewController
-ScrollView
-View

Подскажите как сделать (kbFrameSize.height+40 - изменение этого никак не влияет смещение контента)?


#2

А почему не сделать

scrollView.contentOffset = CGPoint(x: 0, y: kbFrameSize.height + 40)

?


#3

Одно полее ввода находится в верхней части экрана, второе поле в нижней части (таблица с добавлением строк).

Сделать так чтобы “удобно” открывалась в зависимости от активной ячейки не удалось, поэтому воспользовался советом из комментариев - он оказался идеален за исключением, что кнопка прячется.


#4

Тут лучше использовать textFieldDelegate
С его помощью Вы можете изменить положение scrollView в зависимости от активного textField


#5

Можно подробней? Или ссылку киньте где почитать, ибо пока опыта практического нет, чтобы понять что вы имеете ввиду.

ЗЫ С contentInset не возможно сделать то что я хочу?


#6

Вот документация
А сделать реально все, просто нужно понимать что именно вы хотите


Keyboard Show/Hide
#7

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

Что хочу я написал - чтобы контент поднимался выше при вызове клавиатуры…


#8

Сделал чтобы работало как хочу

func kbWillShow(_ notification: Notification) {
    var heightServiceCell = 35
    switch servicesArray.count {
    case 1:
        heightServiceCell *= 0
    case 2:
        heightServiceCell *= 1
    case 3:
        heightServiceCell *= 2
    case 4:
        heightServiceCell *= 3
    case 5:
        heightServiceCell *= 4
    case 6:
        heightServiceCell *= 5
    default:
        heightServiceCell *= 6
    }
    let kbFrameSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    if scrollView.frame.origin.y == 0 {
        scrollView.contentInset = UIEdgeInsetsMake(0, 0, kbFrameSize.height, 0)
        scrollView.contentOffset = CGPoint(x: 0, y: heightServiceCell + 20)
    }
}

func kbWillHide() {
    var heightServiceCell : CGFloat = 35
    switch servicesArray.count {
    case 1:
        heightServiceCell *= 0
    case 2:
        heightServiceCell *= 1
    case 3:
        heightServiceCell *= 2
    case 4:
        heightServiceCell *= 3
    case 5:
        heightServiceCell *= 4
    case 6:
        heightServiceCell *= 5
    default:
        heightServiceCell *= 6
    }
    if scrollView.contentOffset.y == (heightServiceCell + 20) {
        scrollView.contentInset = UIEdgeInsets.zero
        scrollView.contentOffset = CGPoint(x: 0, y: -64)
    } else {
        scrollView.contentInset = UIEdgeInsets.zero
        scrollView.contentOffset = CGPoint(x: 0, y: 0)
    }
}

Осталось только красоту в коде сделать.
Спасибо

Оптимизация проведена:

func kbWillShow(_ notification: Notification) {
    let kbFrameSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    if scrollView.frame.origin.y == 0 {
        scrollView.contentInset = UIEdgeInsetsMake(0, 0, kbFrameSize.height, 0)
        scrollView.contentOffset = CGPoint(x: 0, y: (CGFloat(servicesArray.count - 1))*servicePriceTView.rowHeight + CGFloat(20))
    }
}

func kbWillHide() {
    if scrollView.contentOffset.y == (CGFloat(servicesArray.count - 1))*servicePriceTView.rowHeight + CGFloat(20) {
        scrollView.contentInset = UIEdgeInsets.zero
        scrollView.contentOffset = CGPoint(x: 0, y: -64)
    } else {
        scrollView.contentInset = UIEdgeInsets.zero
        scrollView.contentOffset = CGPoint(x: 0, y: 0)
    }
}