Я разработал структуру для решения этой проблемы лучше и опубликовал ее сейчас. Это не только для UITextField и UITextView, он работает для любого пользовательского UIView, который принимает протокол UITextInput, например UITextField и UITextView, и предлагает множество полезных функций. Вы можете установить его через Carthage, CocoaPods или Swift Package Manager.
ODScrollView GitHub
ODScrollView Medium
ODScrollView - это просто UIScrollView, который автоматически перемещает редактируемые текстовые области, такие как UITextField и UITextView, по вертикали в зависимости от видимости клавиатуры, чтобы улучшить взаимодействие с пользователем.
Функции
- Автоматически перемещает UIViews первого респондента, которые принимают протокол UITextInput, вверх / вниз, когда клавиатура появляется / исчезает, например UITextField, UITextView, UISearchTextField или любой пользовательский UIView, который принимает протокол UITextInput.
- Обратите внимание, что если кадр UITextInput НЕ соответствует оставшейся области между ODScrollView и клавиатурой, то ODScrollView регулирует UITextInput на основе положения курсора, а не кадра. В таких случаях можно использовать функцию «trackTextInputCursor». Пример
-
Предел регулировки можно применять для каждого UITextInput отдельно для настройки направления регулировки .Top и .Bottom. 20 CGFloat по умолчанию.
-
Регулировка может быть включена / отключена для каждого UITextInput отдельно. по умолчанию true.
-
Директива настройки - .Top, .Center, .Bottom - может применяться для каждого UITextInput отдельно. .Bottom по умолчанию. Пример
- Параметры настройки определяют, как настраивается ODScrollView. .Всегда по умолчанию.
- .Всегда: ODScrollView всегда регулирует UITextInput, который помещается в любом месте ODScrollView, независимо от того, перекрывается ли UITextInput с отображаемой клавиатурой. Пример
- .IfNeeded: ODScrollView корректирует UITextInput только в том случае, если он перекрывается с показанной клавиатурой. Пример
- Помимо UIScrollView.keyboardDismissModes, клавиатуру можно закрыть, коснувшись UIView, который предоставляется ODScrollViewDelegate. После закрытия клавиатуры ODScrollView может вернуть исходное положение. по умолчанию nil и false. Пример
Использование
1 - Первое, что вам нужно сделать, это правильно настроить ODScrollView и его представление содержимого. Поскольку ODScrollView - это просто UIScrollView, вы можете реализовать ODScrollView так же, как и для UIScrollView. Вам решать, создавать ODScrollView с помощью раскадровки или программно.
Если вы создаете ODScrollView программно, вы можете продолжить с шага 4.
Предлагаемый способ создания UIScrollView в раскадровке
- If you are using Content Layout Guide and Frame Layout Guide:
1.1 - scrollView: Place UIScrollView anywhere you want to use.
1.2 - contentView: Place UIView inside scrollView.
1.3 - Set contentView's top, bottom, leading and trailing constraints to Content Layout Guide's constraints.
1.4 - Set contentView's width equal to Frame Layout Guide's width.
1.5 - Set contentView's height equal to Frame Layout Guide's height or set static height which is larger than scrollView's height.
1.6 - Build your UI inside contentView.
- If you are NOT using Content Layout Guide and Frame Layout Guide:
1.1 - scrollView: Place UIScrollView anywhere you want to use.
1.2 - contentView: Place UIView inside scrollView.
1.3 - Set contentView's top, bottom, leading and trailing constraints to 0.
1.4 - Set contentView's width equal to scrollView's width.
1.5 - Set contentView's height equal to scrollView's superview's height or set static height which is larger than scrollView's height.
1.6 - Build your UI inside contentView.
2 - Измените класс scrollView с UIScrollView на ODScrollView в инспекторе удостоверений на Storyboard.
3 - Создание IBOutlets для scrollView и contentView на ViewController.
4 - Вызов следующих методов внутри ViewDidLoad () на ViewController:
override func viewDidLoad() {
super.viewDidLoad()
//ODScrollView setup
scrollView.registerContentView(contentView)
scrollView.odScrollViewDelegate = self
}
5 - Необязательно: вы по-прежнему можете использовать функции UIScrollView:
override func viewDidLoad() {
super.viewDidLoad()
//ODScrollView setup
scrollView.registerContentView(contentView)
scrollView.odScrollViewDelegate = self
// UIScrollView setup
scrollView.delegate = self // UIScrollView Delegate
scrollView.keyboardDismissMode = .onDrag // UIScrollView keyboardDismissMode. Default is .none.
UITextView_inside_contentView.delegate = self
}
6 - Принять ODScrollViewDelegate из ViewController и выбрать параметры ODScrollView:
extension ViewController: ODScrollViewDelegate {
// MARK:- State Notifiers: are responsible for notifiying ViewController about what is going on while adjusting. You don't have to do anything if you don't need them.
// #Optional
// Notifies when the keyboard showed.
func keyboardDidShow(by scrollView: ODScrollView) {}
// #Optional
// Notifies before the UIScrollView adjustment.
func scrollAdjustmentWillBegin(by scrollView: ODScrollView) {}
// #Optional
// Notifies after the UIScrollView adjustment.
func scrollAdjustmentDidEnd(by scrollView: ODScrollView) {}
// #Optional
// Notifies when the keyboard hid.
func keyboardDidHide(by scrollView: ODScrollView) {}
// MARK:- Adjustment Settings
// #Optional
// Specifies the margin between UITextInput and ODScrollView's top or bottom constraint depending on AdjustmentDirection
func adjustmentMargin(for textInput: UITextInput, inside scrollView: ODScrollView) -> CGFloat {
if let textField = textInput as? UITextField, textField == self.UITextField_inside_contentView {
return 20
} else {
return 40
}
}
// #Optional
// Specifies that whether adjustment is enabled or not for each UITextInput seperately.
func adjustmentEnabled(for textInput: UITextInput, inside scrollView: ODScrollView) -> Bool {
if let textField = textInput as? UITextField, textField == self.UITextField_inside_contentView {
return true
} else {
return false
}
}
// Specifies adjustment direction for each UITextInput. It means that some of UITextInputs inside ODScrollView can be adjusted to the bottom, while others can be adjusted to center or top.
func adjustmentDirection(selected textInput: UITextInput, inside scrollView: ODScrollView) -> AdjustmentDirection {
if let textField = textInput as? UITextField, textField == self.UITextField_inside_contentView {
return .bottom
} else {
return .center
}
}
/**
- Always : ODScrollView always adjusts the UITextInput which is placed anywhere in the ODScrollView.
- IfNeeded : ODScrollView only adjusts the UITextInput if it overlaps with the shown keyboard.
*/
func adjustmentOption(for scrollView: ODScrollView) -> AdjustmentOption {
.Always
}
// MARK: - Hiding Keyboard Settings
/**
#Optional
Provides a view for tap gesture that hides keyboard.
By default, keyboard can be dismissed by keyboardDismissMode of UIScrollView.
keyboardDismissMode = .none
keyboardDismissMode = .onDrag
keyboardDismissMode = .interactive
Beside above settings:
- Returning UIView from this, lets you to hide the keyboard by tapping the UIView you provide, and also be able to use isResettingAdjustmentEnabled(for scrollView: ODScrollView) setting.
- If you return nil instead of UIView object, It means that hiding the keyboard by tapping is disabled.
*/
func hideKeyboardByTappingToView(for scrollView: ODScrollView) -> UIView? {
self.view
}
/**
#Optional
Resets the scroll view offset - which is adjusted before - to beginning its position after keyboard hid by tapping to the provided UIView via hideKeyboardByTappingToView.
## IMPORTANT:
This feature requires a UIView that is provided by hideKeyboardByTappingToView().
*/
func isResettingAdjustmentEnabled(for scrollView: ODScrollView) -> Bool {
true
}
}
7 - Необязательно: вы можете настроить ODScrollView, когда курсор перекрывается с клавиатурой при вводе многострочного UITextInput. trackTextInputCursor (для UITextInput) должен вызываться функциями UITextInput, которые запускаются при вводе.
/**
## IMPORTANT:
This feature is not going to work unless textView is subView of _ODScrollView
*/
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
_ODScrollView.trackTextInputCursor(for textView)
return true
}
вы можете использовать анимацию в текстовом поле, чтобы текстовое поле перемещалось при появлении клавиатуры
Проверь это. Никаких хлопот для вас. TPKeyboardAvoading
Это задокументировано Apple, я думаю, что это лучший способ: developer.apple.com/library/ios/#documentation/StringsTextFonts/…
Автоматическая раскладка и раскладка с учетом клавиатуры, автор ghawk.gu В статье также рассказывается, как работать с книжной и альбомной ориентацией.
В приведенной ниже ссылке объясняется, как прокручивать представление для отображения полей, включая UITextField , очень четко скрытого с клавиатуры с четким кодом и диаграммами Щелкните меня 1 Ссылка на концентратор git ниже дает работающий исходный код Нажми меня 2
Очень хорошее руководство с изображениями находится по адресу: cocoawithlove.com/2008/10/…
Это хорошее решение сработало для меня: github.com/simonbs/BSKeyboardControls
Используйте этот код. Вам просто нужна 1 строка в файле appdelegate.m, и он работает. github.com/hackiftekhar/IQKeyboardManager
Лучший способ, который я нашел до сих пор, - это открытый исходный код TPKeyboardAvoiding
IQKeyboardManager не работает в портретном режиме 4s
Эти решения были для меня лучше: coderhelper.com/a/15036744/1234031
UITableViewController с UITextFields внутри статических ячеек был бы хорошим решением для такого рода требований. Попробуйте, вам это действительно очень нравится.
Для тех, кто использует
storyboard
и пытается заставить его работать, но не может, просто убедитесь, чтоself.view
имеет ведущий , верхний и конечный 389constraints
> определено. В противном случае это, вероятно, не сработает для IQKeyboardManager или для ответов ниже.Вам не нужно полагаться на создание пользовательского кода для перемещения любого представления вверх, когда появится клавиатура. Вы можете просто использовать библиотеку IQKeyboardManagerSwift, такую же доступную для кода Objective-C.
Код управления клавиатурой Apple Swift 3.0 находится здесь: medium.com/@abhimuralidharan/…
Возможный дубликат Измените размер экрана при появлении клавиатуры
Другой способ - добавить такие текстовые поля содержимого и все в TableViewController и позволить tableview обрабатывать это.
Перейдите по ссылке ниже: coderhelper.com/questions/48922266/…
вот общее, простое и популярное решение ! coderhelper.com/a/41808338/294884
coderhelper.com/questions/1126726/…