У меня проблемы с кодом. Я пытаюсь переместить, UIScrollView
когда редактируюUITextField
который должен быть скрыт щелчком клавиатуры.
Я перемещаю основной фрейм прямо сейчас, потому что не знаю, как «прокрутить вверх» код. Итак, я сделал немного кода, он работает нормально, но когда я редактирую поле UItext и переключаюсь на другое, UITextField
не нажимая кнопку «возврат», главное представление переходит на более высокий уровень.
Я сделал NSLog()
свои переменные size, distance и textFieldRect.origin.y, как вы можете видеть ниже. Когда я помещаю два UITextField
в одно и то же место (начало y) и делаю этот конкретный «переключатель» (без нажатия клавиши возврата), я получаю те же числа, тогда как мой код работал нормально для первого UITextField
редактирования, но не для второго редактирования.
Проверь это:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", size);
NSLog(@"distance %d", distance);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
change = FALSE;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
change = TRUE;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
Любые идеи ?
источник
activeField.frame
в относительный фрейм, так какactiveField
не обязательно должен быть непосредственным дочерним элементомself.view
. Обновленный код должен выглядеть примерно так:CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }
UIKeyboardFrameEndUserInfoKey
ключ на iOS 11, потому чтоUIKeyboardFrameBeginUserInfoKey
он часто давал мне нулевую высоту.Я только что реализовал это с помощью Swift 2.0 для iOS9 на Xcode 7 (бета 6), здесь отлично работает.
Отредактировано для Swift 3
Похоже, вам нужно только установить
contentInset
и вscrollIndicatorInset
Swift 3 прокрутка / contentOffset выполняется автоматически ..источник
Все ответы здесь, кажется, забывают о возможностях ландшафта. Если вы хотите, чтобы это работало, когда устройство повернуто в альбомную ориентацию, вы столкнетесь с проблемами.
Хитрость здесь в том, что хотя представление знает об ориентации, клавиатура - нет. Это означает, что в альбомной ориентации ширина клавиатуры фактически равна ее высоте, и наоборот.
Чтобы изменить рекомендуемый Apple способ изменения вставок содержимого и обеспечить поддержку альбомной ориентации, я бы рекомендовал использовать следующее:
Здесь следует обратить внимание на следующее:
Что делает, это определяет, в какой ориентации находится устройство. Если это альбомная ориентация, он «поменяет местами» значения ширины и высоты переменной keyboardSize, чтобы гарантировать, что правильные значения используются в каждой ориентации.
источник
Решение Swift 4 :
источник
UIKeyboardFrameBeginUserInfoKey
наUIKeyboardFrameEndUserInfoKey
UIKeyboardWillShow
,UIKeyboardWillHide
ИUIKeyboardFrameBeginUserInfoKey
был переименован вUIResponder.keyboardWillShowNotification
,UIResponder.keyboardWillHideNotification
иUIResponder.keyboardFrameBeginUserInfoKey
.Для этого не нужно много писать код, это очень просто, как показано ниже: -
весь ваш текст, сохраненный в UIScrollview из пера, как это изображение: -
YourViewController.h
подключить IBOutlet из пера, а также подключить каждого делегата UItextfiled и делегата scrollview из NIB
ПРИМЕЧАНИЕ, если делегат в текстовом поле не подключен, то ни один метод не работает, убедитесь, что все iBOulate и делегат подключены правильно
источник
Рекомендация Apple перекодирована в Swift + Использование UIScrollView с Auto Layout в iOS (на основе следующих ссылок: ссылка 1 , ссылка 2 , ссылка 3 ):
источник
Единственное, что я бы обновил в коде Apple, - это метод keyboardWillBeHidden :, чтобы обеспечить плавный переход.
источник
Вот ответ, совместимый со Swift 3 , который также будет работать с контроллерами представления в контроллере навигации - поскольку они изменят
contentInset.top
свойство представления прокрутки .источник
Решение Swift 4.2 , учитывающее возможные высоты UIToolbar и UITabBar.
И, если вы нацеливаетесь на <iOS 9, вам нужно отменить регистрацию наблюдателя в какой-то момент (спасибо Джо )
источник
Я обнаружил, что приведенные выше ответы устарели. Также не идеально при прокрутке.
Вот быстрая версия.
Он будет прокручиваться прямо под текстовым полем, свободного места нет. И Он вернется к тому состоянию, в котором он был вначале.
источник
Это то, что я использовал. Это просто и хорошо работает.
Использовать
UITextField
вызов делегата,textFieldDidBeginEditing:
чтобы сместить представление вверх, а также добавьте наблюдателя уведомлений, чтобы вернуть представление в нормальное состояние, когда клавиатура скрывается:источник
Это последний код с улучшениями в Swift
источник
Одно из самых простых решений - использовать следующий протокол:
Если вы хотите использовать этот протокол, вам нужно только соответствовать ему и назначить представление прокрутки в контроллере следующим образом:
источник
Я бы сделал это вот так. Это много кода, но он гарантирует, что текстовое поле, находящееся в данный момент в фокусе, будет вертикально центрировано в «доступном пространстве»:
Обратите внимание, что
- (IBAction)textFieldGotFocus:
действие привязано к каждому состоянию textFieldDidBeginEditing
.Также было бы немного лучше получить продолжительность анимации из уведомления клавиатуры и использовать ее для анимации прокрутки вместо фиксированного значения, но подайте на меня в суд, для меня этого было достаточно;)
источник
Используйте следующее расширение, если вы не хотите слишком много рассчитывать:
И, возможно, вы хотите, чтобы ваш UITextField всегда был видимым:
источник
Попробуйте этот код в Swift 3:
источник
Решение Swift 5 на основе вышеприведенного решения Masa - изменения по отношению к нему:
keyboardFrameEndUserInfoKey
вместоkeyboardFrameBeginUserInfoKey
, потому чтоkeyboardFrameBeginUserInfoKey
может при первом показе вернуть другое значение, как описано, например, здесь: высота клавиатуры меняется при появленииUIResponder.keyboardWillShowNotification
/UIResponder.keyboardWillHideNotification
вместоNSNotification.Name.UIKeyboardDidShow
/NSNotification.Name.UIKeyboardDidHide
Код:
источник
На самом деле для этого вам не нужен UIScrollView. Я использовал этот код, и он у меня работает:
источник
Вы можете прокручивать с помощью свойства
contentOffset
вUIScrollView
, например,Также есть метод анимированной прокрутки.
Что касается причины, по которой ваше второе редактирование не прокручивается правильно, это может быть связано с тем, что вы, кажется, предполагаете, что новая клавиатура будет появляться каждый раз, когда начинается редактирование. Вы можете попробовать проверить, отрегулировали ли вы уже видимое положение «клавиатуры» (и аналогичным образом проверьте видимость клавиатуры в данный момент, прежде чем возвращать ее).
Лучшим решением может быть прослушивание уведомления клавиатуры, например:
источник
Я знаю, что это старый вопрос, но я подумал, что это может помочь другим. Я хотел что-то более легкое в реализации для нескольких моих приложений, поэтому я создал для этого класс. Вы можете скачать его здесь, если хотите: https://github.com/sdernley/iOSTextFieldHandler
Это так же просто, как установить для всех UITextFields делегата self.
А затем добавьте это в свой контроллер представления с именем вашего scrollView и кнопки отправки
источник
Ниже приведены мои решения, которые работают (5 шагов)
Шаг 1: Добавьте наблюдателя, чтобы отслеживать, какой UITEXTFIELD или UITEXTVIEW ShoudBeginEditing (где объект инициализирован или ViewDidLoad.
Шаг 2. Опубликуйте уведомление, когда ..ShouldBeginEditing с OBJECT равным UITEXTFIELD или UITEXTVIEW.
Шаг 3: метод, который (вызывает Step1) назначает текущий UITEXTFIELD или UITEXTVIEW
Шаг 4: добавьте наблюдателя клавиатуры UIKeyboardWillShowNotification (то же место, что и шаг 1)
и метод:
Шаг 5: Добавьте наблюдателя клавиатуры UIKeyboardWillHideNotification (то же место, что и шаг 1)
и метод:
Не забудьте удалить наблюдателей!
источник
Я использовал этот ответ, предоставленный Судхиром Палчури https://stackoverflow.com/users/2873919/sudheer-palchuri https://stackoverflow.com/a/32583809/6193496
В ViewDidLoad зарегистрируйте уведомления:
Добавьте ниже методы наблюдателя, которые выполняют автоматическую прокрутку при появлении клавиатуры.
источник
Мое решение состоит из 4 шагов:
- Шаг 1: функция прослушивает, когда появляется клавиатура.
- Шаг 2: функция слушает, когда клавиатура исчезает
- Шаг 3: добавьте эти функции в центр уведомлений:
- Шаг 4: удалите прослушивание, когда контроллер представления не работает
источник