После долгих проб и ошибок я сдаюсь и задаю вопрос. Я видел много людей с похожими проблемами, но не могу заставить все ответы работать правильно.
У меня есть, UITableView
который состоит из пользовательских клеток. Ячейки состоят из 5 текстовых полей, расположенных рядом друг с другом (вроде сетки).
Когда я пытаюсь прокрутить и отредактировать ячейки внизу UITableView
, мне не удается правильно расположить ячейки над клавиатурой.
Я видел много ответов, говорящих об изменении размеров вида и т. Д., Но пока ни один из них не сработал.
Кто-нибудь может уточнить «правильный» способ сделать это с конкретным примером кода?
Ответы:
Если вы используете UITableViewController вместо UIViewController, он автоматически сделает это.
источник
Функция, которая выполняет прокрутку, может быть намного проще:
Вот и все. Никаких расчетов вообще.
источник
contentInset
, который, очевидно, не учитывается при запросеvisibleRows
илиindexPathsForVisibleRows
.Я делаю что-то очень похожее, это универсально, нет необходимости вычислять что-то конкретное для вашего кода. Просто проверьте замечания по коду:
В MyUIViewController.h
В MyUIViewController.m
Версия Swift 1.2+:
источник
[tableView scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionMiddle animated: YES];
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; CGFloat tabBarHeight = appDelegate.tabBarController.tabBar.frame.size.height;
Затем вычтите tabBarHeight из высоты клавиатуры, где бы вы ни использовали высоту клавиатуры.Самое простое решение для Swift 3 , основанное на решении Bartłomiej Semańczyk :
источник
Notification
вместоNSNotification
было бы более "Свифт 3-й" :-)У меня была такая же проблема, но я заметил, что она появляется только в одном представлении. Поэтому я начал искать различия в контроллерах.
Я обнаружил, что
- (void)viewWillAppear:(BOOL)animated
в супер экземпляре установлено поведение прокрутки .Так что не забудьте реализовать так:
И не важно, используете ли вы
UIViewController
илиUITableViewController
; проверил это, поместивUITableView
в качестве подпредставления self.view вUIViewController
. Это было то же самое поведение. Представление не позволяло прокрутить, если звонок[super viewWillAppear:animated];
отсутствовал.источник
Возможно, я пропустил это, поскольку я не прочитал весь пост здесь, но то, что я придумал, кажется обманчиво простым. я не проверял это, проверяя во всех ситуациях, но кажется, что все должно работать нормально.
просто отрегулируйте contentInset табличного представления по высоте клавиатуры, а затем прокрутите ячейку вниз:
и конечно
это слишком просто? я что-то упускаю? до сих пор это работает для меня хорошо, но, как я уже сказал, я не положил это через отжимной ...
источник
[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]
contentInset
и резко изменит границы прокрутки.Я думаю, что нашел решение, соответствующее поведению приложений Apple.
Во-первых, в вашем viewWillAppear: подпишитесь на уведомления клавиатуры, чтобы вы знали, когда клавиатура будет отображаться и скрываться, и система сообщит вам размер клавиатуры, но не забудьте отменить регистрацию в вашем viewWillDisappear :.
Реализуйте методы, аналогичные приведенным ниже, чтобы настроить размер вашего tableView так, чтобы он соответствовал видимой области, как только появится клавиатура. Здесь я отслеживаю состояние клавиатуры отдельно, поэтому я могу сам выбирать, когда установить tableView обратно на полную высоту, поскольку вы получаете эти уведомления при каждом изменении поля. Не забудьте реализовать keyboardWillHide: и выбрать подходящее место, чтобы зафиксировать размер таблицы.
Теперь вот бит прокрутки, сначала мы прорабатываем несколько размеров, затем видим, где мы находимся в видимой области, и устанавливаем прямоугольник, который мы хотим прокрутить, чтобы он был либо наполовину, либо над серединой текстового поля на основе на то, где это в представлении. В этом случае у нас есть массив UITextFields и перечисление, которое отслеживает их, поэтому умножение rowHeight на номер строки дает нам фактическое смещение кадра в этом внешнем виде.
Кажется, это работает довольно хорошо.
источник
UIKeyboardBoundsUserInfoKey
устарела с iOS 3.2. Посмотрите мое решение ниже, которое работает во всех текущих версиях iOS ≥ 3.0. / @ iPhoneDevЕсли вы можете использовать
UITableViewController
, вы получаете функциональность бесплатно. Иногда, однако, это не вариант, особенно если вам нужно несколько представлений, а не толькоUITableView
.Некоторые из представленных здесь решений не работают на iOS ≥4, некоторые не работают на iPad или в альбомном режиме, некоторые не работают на клавиатурах Bluetooth (где нам не нужна прокрутка), некоторые не работают работать при переключении между несколькими текстовыми полями. Поэтому, если вы выбираете какое-либо решение, обязательно протестируйте эти случаи. Это решение , которое мы
используемиспользуется в InAppSettingsKit :Вот полный код класса в InAppSettingsKit. Чтобы проверить это, используйте дочернюю панель «Полный список», где вы можете протестировать сценарии, упомянутые выше.
источник
Самое простое решение для Swift :
источник
Я надеюсь, что вы, ребята, уже получили решение, прочитав все это. Но я нашел свое решение следующим образом. Я ожидаю, что у вас уже есть клетка с
UITextField
. Поэтому при подготовке просто сохраните индекс строки в теге текстового поля.Создайте
activeTextField
экземплярUITextField
с глобальной областью действия, как показано ниже:Итак, теперь вы просто скопируйте и вставьте мой код в конце. А также не забудьте добавить
UITextFieldDelegate
Регистрирует клавиатуру
notifications
Ручки клавиатуры
Notifications
:Вызывается, когда
UIKeyboardDidShowNotification
отправлено.Вызывается при
UIKeyboardWillHideNotification
отправкеТеперь осталось одно: вызвать
registerForKeyboardNotifications
метод вViewDidLoad
метод следующим образом:Вы сделали, надеюсь, ваша
textFields
клавиатура больше не будет скрыта.источник
Объединяя и заполняя пробелы из нескольких ответов (в частности, Ortwin Gentz, пользователь 98013) и другого поста, это будет работать из коробки для SDK 4.3 на iPad в портретном или альбомном режиме:
источник
Если вы используете uitableview для размещения своих текстовых полей ( от Джеффа Ламарша ), вы можете просто прокрутить табличное представление, используя метод делегата, например, так.
(Примечание: мои текстовые поля хранятся в массиве с тем же индексом, что и строка в табличном представлении)
источник
Уведомления клавиатуры работают, но пример кода Apple для этого предполагает, что представление прокрутки является корневым представлением окна. Обычно это не тот случай. Вы должны компенсировать вкладки и т. Д., Чтобы получить правильное смещение.
Это проще, чем кажется. Вот код, который я использую в UITableViewController. У него есть две переменные экземпляра: hiddenRect и keyboardShown.
источник
UIKeyboardCenterEndUserInfoKey
иUIKeyboardBoundsUserInfoKey
устарели с iOS 3.2. Посмотрите мое решение ниже, которое работает во всех текущих версиях iOS ≥ 3.0.Если вы используете
Three20
, то используйтеautoresizesForKeyboard
свойство. Просто установите в-initWithNibName:bundle
методе контроллера вашего представленияЭто заботится о:
Сделано и сделано.
источник
Мой подход:
Сначала я создаю подкласс UITextField и добавляю свойство indexPath. В методе cellFor ... я передаю свойство indexPath.
Затем я добавляю следующий код:
в textFieldShould / WillBegin ... и т. д.
Когда клавиатура исчезнет, вы должны повернуть ее с помощью:
источник
Более продуманное решение. Он проскальзывает в методы делегата UITextField, поэтому он не требует путаницы с уведомлениями UIKeyboard.
Замечания по реализации:
kSettingsRowHeight - высота UITableViewCell.
offsetTarget и offsetThreshold отключены от kSettingsRowHeight. Если вы используете другую высоту строки, установите эти значения для свойства y точки. [alt: рассчитать смещение строки другим способом.]
}
}
источник
Используйте
UITextField's
delegate
метод:стриж
Objective-C
источник
Swift 4.2 полное решение
Я создал GIST с набором протоколов, который упрощает работу с добавлением дополнительного пространства, когда клавиатура отображается, скрывается или изменяется.
Особенности :
использование
Пример основного использования в контроллере представления, который содержит некоторое представление прокрутки (представление таблицы также поддерживается, конечно).
Core: наблюдатель смены кадров
Протокол
KeyboardChangeFrameObserver
будет запускать событие каждый раз при смене кадра клавиатуры (включая отображение, скрытие, смену кадра).addKeyboardFrameChangesObserver()
вviewWillAppear()
или подобный метод.removeKeyboardFrameChangesObserver()
вviewWillDisappear()
или подобный метод.Реализация: прокрутка
ModifableInsetsOnKeyboardFrameChanges
Протокол добавляетUIScrollView
поддержку основного протокола. Изменяет вставки вида прокрутки при смене рамки клавиатуры.Вашему классу нужно установить вид прокрутки, вставки будут увеличиваться / уменьшаться при смене кадров клавиатуры.
источник
Поскольку у вас есть текстовые поля в таблице, лучший способ на самом деле - изменить размер таблицы - вам нужно установить меньшую высоту tableView.frame по размеру клавиатуры (я думаю, около 165 пикселей), а затем снова развернуть ее, когда клавиатура распущена.
При желании вы также можете отключить взаимодействие с пользователем для tableView в это время, если вы не хотите, чтобы пользователь прокручивал.
источник
Это прекрасно работает и на iPad тоже.
источник
Я попробовал почти такой же подход и придумал более простой и меньший код для того же самого. Я создал IBOutlet iTextView и связал его с UITextView в IB.
источник
Так что после нескольких часов изнурительной работы, пытаясь использовать эти текущие решения (и совершенно безуспешно), я наконец-то все заработало, и обновил их, чтобы использовать новые блоки анимации. Мой ответ полностью основан на ответе Ортвина выше .
Так что по какой-то причине приведенный выше код просто не работал для меня. Мои настройки казались довольно похожими на других, но, может быть, потому что я был на iPad или 4.3 ... не знаю. Он занимался какой-то дурацкой математикой и снимал мой стол с экрана.
Смотрите конечный результат моего решения: http://screencast.com/t/hjBCuRrPC (Пожалуйста, игнорируйте фотографию. :-P)
Таким образом, я понял суть того, что делал Ортвин, но изменил то, как он делал некоторые математические операции, чтобы сложить origin.y & size.height моего табличного представления с высотой клавиатуры. Когда я вычитаю высоту окна из этого результата, он говорит мне, сколько пересечений у меня происходит. Если его значение больше 0 (иначе есть некоторое перекрытие), я выполняю анимацию высоты кадра.
Кроме того, были некоторые проблемы с перерисовкой, которые были решены с помощью 1) ожидания прокрутки до ячейки до завершения анимации и 2) использования опции UIViewAnimationOptionBeginFromCurrentState при скрытии клавиатуры.
Несколько вещей, чтобы отметить.
Опять же, я бы не получил этот ответ, если бы Ортвин не представил его суть. Вот код:
источник
Этот солутон работает для меня, пожалуйста, обратите внимание на строку
Вы можете изменить значение 160, чтобы оно соответствовало вашей работе
источник
Очень интересная ветка обсуждения, я также столкнулся с той же проблемой, может быть хуже, потому что
Так что читайте темы здесь и внедрите мою версию, которая помогла мне перенести содержимое в iPad в альбомном режиме. Вот код (это не дурак и все, но это исправило мою проблему) Сначала вам нужно иметь делегата в вашем пользовательском классе ячеек, который при редактировании начинает, отправляет текстовое поле в ваш viewcontroller и устанавливает там activefield = theTextField
// ОСУЩЕСТВЛЯЕТСЯ ТОЛЬКО ДЛЯ РАБОТЫ С ЛАНДШАФТНЫМ РЕЖИМОМ
// Вызывается при отправке UIKeyboardWillHideNotification
-anoop4real
источник
Я только что решил эту проблему сам после того, как я сослался на массу решений, найденных через Google и Stack Overflow.
Сначала убедитесь, что вы настроили IBOutlet вашего UIScrollView, а затем внимательно посмотрите на Apple Doc: Управление с клавиатуры . Наконец, если вы можете прокрутить фон, но клавиатура по-прежнему покрывает текстовые поля, посмотрите на этот фрагмент кода:
Основное различие между этой частью и Apple заключается в условии if. Я считаю, что Apple рассчитывает расстояние прокрутки и условие, является ли текстовое поле, покрытое клавиатурой, неточным, поэтому я сделал свою модификацию, как указано выше.
Дайте мне знать, если это работает
источник
Пример в Swift, использующий точную точку текстового поля из Get indexPath UITextField в UITableViewCell с Swift :
источник
Еще один простой метод (работает только с одним разделом)
источник
Если ваш UITableView управляется подклассом UITableViewController, а не UITableView, а делегатом текстового поля является UITableViewController, он должен автоматически управлять всей прокруткой - все эти другие комментарии очень трудно реализовать на практике.
Для хорошего примера см. Пример проекта кода Apple: TaggedLocations.
Вы можете видеть, что он прокручивается автоматически, но, похоже, нет кода, который это делает. В этом проекте также есть настраиваемые ячейки табличного представления, поэтому, если вы создадите свое приложение, руководствуясь им, вы должны получить желаемый результат.
источник
Вот как я сделал эту работу, которая представляет собой смесь ответов Сэма Хо и Марселя В. и некоторых моих собственных исправлений ошибок, внесенных в мой дерьмовый код. Я использовал UITableViewController. Таблица теперь изменяет размеры правильно, когда отображается клавиатура.
1) В
viewDidLoad
добавлено:self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
2) Я забыл назвать
super
эквиваленты вviewWillAppear
иawakeFromNib
. Я добавил их обратно.источник
UITableViewController
делает прокрутку автоматически, действительно. Разница по сравнению с использованием aUIViewController
заключается в том, что вы должны создавать элементы Navbar-Buttonitems программно, используяNavigationController
, при использовании aTableViewController
.источник