contentInset UIScrollView не работает

Я пытаюсь переместить контент вверх, когда появляется клавиатура. Это контент, представляющий собой простую форму входа в систему.

введите описание изображения здесь введите описание изображения здесь

Обратите внимание, что это не UITextFields. Это просто маленький UITableView в середине UIViewController. И у меня есть UIScrollView, заполняющий контроллер представления, встраивающий это табличное представление.

Я зарегистрировался для получения уведомлений с клавиатуры, UIKeyboardDidShowNotification и UIKeyboardWillHideNotification.

И в методе, который срабатывает при появлении клавиатуры, я реализовал вариант ответа this, который делает примерно то же вещь, устанавливая значение bottom для UIEdgeInsets, которое используется для установки contentInset представления прокрутки.

func keyboardWasShown(notification: NSNotification) {

    var info: NSDictionary = notification.userInfo as NSDictionary
    var keyboardSize: CGSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size

    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
}

Проблема в том, что он ничего не делает. Я успешно получил высоту клавиатуры, но ничего не изменилось. Кто-нибудь может сказать мне, почему и что я должен сделать, чтобы это исправить?

Спасибо.


person Isuru    schedule 05.08.2014    source источник
comment
проверьте этот ответ, это для ObjC, но логика та же: stackoverflow.com/questions/23988866/   -  person holex    schedule 05.08.2014


Ответы (3)


UIEdgeInsets UIEdgeInsetsMake (
   CGFloat top,
   CGFloat left,
   CGFloat bottom,
   CGFloat right
);

Вы устанавливаете дно. Попробуйте установить верхние вставки. Может быть, поможет отрицательное значение.

person The dude    schedule 05.08.2014
comment
Установка отрицательного значения для верхнего начала сработала, но я не хотел жестко кодировать значения. Вот почему я искал более чистый метод. Мне удалось это сделать другим методом. Я разместил здесь свой ответ. - person Isuru; 05.08.2014

После долгой борьбы я смог добиться того, чего хотел. Что я сделал, так это в viewDidLoad я зарегистрировался для уведомлений с клавиатуры. И когда появляется клавиатура, я вставляю ее фрейм в переменную, а фрейм формы входа (которая является табличным представлением) в другую переменную.

Используя CGRectIntersection, я получил рамку пересекаемой части, когда клавиатура перекрывает форму входа в систему и идет по ее высоте. Затем я просто установил его в методе setContentOffset представления прокрутки для автоматического перемещения прокрутки вверх. Чтобы переместить его обратно в исходное положение, я просто снова установил для свойства scroll view contentOffset значение CGPointZero.

func registerForKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}

func keyboardWasShown(notification: NSNotification) {
    var info: NSDictionary = notification.userInfo as NSDictionary
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
    var loginFormFrame: CGRect = self.view.convertRect(self.tableView.frame, fromView: nil)
    var coveredFrame: CGRect = CGRectIntersection(loginFormFrame, keyboardFrame)

    self.scrollView.setContentOffset(CGPointMake(0, coveredFrame.height + 20), animated: true)
}

func keyboardWillBeHidden(notification: NSNotification) {
    self.scrollView.contentOffset = CGPointZero
}
person Isuru    schedule 05.08.2014

ContentInset означает расстояние, на котором представление содержимого вставлено из ограничивающего представления прокрутки. Что вам нужно сделать, так это изменить значение origin.y.

См. Как заставить UITextField двигаться вверх, когда клавиатура присутствует?

person Allen    schedule 05.08.2014
comment
contentInset был разработан специально для обработки появляющихся на экране клавиатур без изменения frame экземпляра UIScrollView - так что с frame нет ничего общего, вместо этого вам нужно было связать этот: stackoverflow.com/questions/23988866/ - person holex; 05.08.2014
comment
@Allen: Я видел эту ветку раньше, но решения там были бесполезны, потому что у меня нет UITextField в представлении. - person Isuru; 05.08.2014
comment
@holex Я действительно хотел автоматически перемещать прокрутку вверх, вместо того, чтобы позволять пользователю прокручивать вверх. Мне удалось этого добиться. Я разместил здесь свой ответ. - person Isuru; 05.08.2014