Форум программистов, компьютерный форум, киберфорум
Swift
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10

Как сделать сдвиг контента в UIScrollView при вводе данных в TextField?

14.05.2015, 14:08. Показов 3785. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак подробней. Есть ViewController. Внутри него UIScrollView. На этом ScrollView есть элементы типа Label, TextField, Button. Но проблема в том что когда я хочу ввести данные в TextField который находится внизу, выдвигающаяся клавиатура перекрывает поле ввода, и соответственно я не могу видеть что я ввожу. В некоторых приложениях я видел что когда поле TextField находится внизу, то при нажатии на него выскакивает клавиатура, а все элементы сдвигаются вверх так, что поле, в которое я собираюсь вводить данные, будет находиться четко над клавиатурой. Так как мне сделать такое же у себя? Если это делается программно, то пожалуйста напишите на Swift, так как диплом пишу на нём.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2015, 14:08
Ответы с готовыми решениями:

Как сделать чтобы при вводе данных в edit рисовался график
Ребята как сделать чтобы при вводе данных в edit рисовался график Можете код скинуть

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

Ошибка при не верном вводе данных. Как сделать ее информативным для пользователей?
Не большой скрипт, с несколькими полями для ввода. из первого поля я вытаскиваю нужные данные методом explode, и потом записываю все это в...

4
8 / 7 / 2
Регистрация: 15.10.2013
Сообщений: 19
15.05.2015, 11:47
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Скрол
@IBOutlet weak var scrollView: UIScrollView!
 
//подписываешься на Нотификации
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWasShown:"), name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWasHidden:"), name: UIKeyboardWillHideNotification, object: nil)
 
//Black Magic
    func keyboardWasShown(notif: NSNotification) {
        if self.scrollView != nil {
            let dictInfo: NSDictionary = notif.userInfo!
            let valInfo: NSValue = dictInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey)! as! NSValue
            let arect: CGRect = valInfo.CGRectValue()
            let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, arect.height + 20, 0)
            //UIEdgeInsetsMake(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) -> UIEdgeInsets
            
            if let view:AnyObject = UIWindow.getEditingViewOnView(self.scrollView) {
                let scrollH = self.scrollView.frame.size.height - insets.bottom
                var y = (view as! UIView).frame.origin.y - (scrollH / 3)
                if y < 0 {
                    y = 0
                }
                self.scrollView.setContentOffset(CGPointMake(0, y), animated: false)
            }
            
            self.scrollView.contentInset = insets
            self.scrollView.scrollIndicatorInsets = insets
        }
    }
    
    func keyboardWasHidden(notif: NSNotification) {
        if self.scrollView != nil {
            let dictInfo: NSDictionary = notif.userInfo!
            let valInfo: NSValue = dictInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey)! as! NSValue
            let arect: CGRect = valInfo.CGRectValue()
            
            let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, 0, 0)
            
            self.scrollView.contentInset = insets
            self.scrollView.scrollIndicatorInsets = insets
//            self.scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
        }
    }
1
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
15.05.2015, 12:00  [ТС]
Спасибо вам большое! я уже подправил некоторые ошибки, осталась только одна, не знаю что с ней делать.
UIWindows.Type does not have a member named 'getEditingViewOnView'.

может это из-за Xcode? у меня стоит 6.2, и допустим вы в некоторых местах ставили восклицательные знаки, а мой Xcode показал что они не нужны.
0
8 / 7 / 2
Регистрация: 15.10.2013
Сообщений: 19
15.05.2015, 12:34
Xcode 6.3
создай категорию UIWindow, и добавь этот метод, ну или по своему реализуй!

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
+ (UIView*)getEditingViewOnView:(UIView*)superview {
    for (UIView *subView in superview.subviews)
    {
        if (subView.isFirstResponder) {
            return subView;
        }
        UIView *view = [self getEditingViewOnView:subView];
        if (view != nil) {
            return view;
        }
    }
    return nil;
}
1
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
15.05.2015, 18:47
Так как редактируемый элемент на экране может быть только 1, который во время редактирования становится first responder - то алгоритм таков:
1) в начале редактирования (при тапе на textfield или textview) надо сохранить ссылку на редактируемое поле. Для этого надо ввести property (хотя я пользуюсь ivar - не люблю свойства плодить). Тип ссылки - UITextField или UITextView. Хотя, я в последнее время использую тупо базовый класс UIView (удобно, когда на одном экране оба типа присутствуют). Узнать начало процесса редактирвоания можно с помощью делегата от соответствующего типа (например TextFieldShouldBeginEditing)
2) в конце редактирования надо просто вызвать ссылкой resignfirstresponder.

Данный способ проще и работает всегда. А то, что написалHellBoy4eG, содержит цикл, if'ы - что замедляет выполнение программы. Более того, при использовании сложной иерархии видов оно вообще работать не будет.

Вообще, все это довольно просто ищется в англоязчном гугле. Вот тут очень понятно описано то, о чем я сказал.

И неважно, swift или objective c. Алгоритм одинаков, а переписать с одного языка на другой данный пример - раз плюнуть.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2015, 18:47
Помогаю со студенческими работами здесь

Как сделать так, чтобы при вводе данных с клавиатуры, работал таймер, например на 20 секунд?
Хотел создать игру, но не знаю как сделать так, чтобы при вводе данных с клавиатуры, работал таймер, например на 20 секунд, а при истечении...

Как сделать так, чтобы при вводе данных в одной таблице, они вводились автоматически во второй?
У меня есть две таблицы в SQL Заявки и Материалы. В Материалах есть поля код материала, наименование и количество, она связана с таблицей...

Рамка поиска при вводе смещается в сторону контента
Привет всем сразу предупреждаю в верстке я профан занимался ремонтом ПК так-что рассчитываю на понимание. Кто нибудь устанавливал себе...

Как сделать запрос пользователю о вводе данных?
У меня есть программа по симплекс-методу. Когда данные введены изначально - все хорошо считает. Но мне надо сделать так, что бы...

Как изменить шрифт в консольном приложений при вводе данных и в выводе данных ?
Как изменить шрифт в консольном приложений при вводе данных и в выводе данных ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru