Форум программистов, компьютерный форум CyberForum.ru

Swift

Войти
Регистрация
Восстановить пароль
 
Nikita_Krasnov
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
#1

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

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

Итак подробней. Есть ViewController. Внутри него UIScrollView. На этом ScrollView есть элементы типа Label, TextField, Button. Но проблема в том что когда я хочу ввести данные в TextField который находится внизу, выдвигающаяся клавиатура перекрывает поле ввода, и соответственно я не могу видеть что я ввожу. В некоторых приложениях я видел что когда поле TextField находится внизу, то при нажатии на него выскакивает клавиатура, а все элементы сдвигаются вверх так, что поле, в которое я собираюсь вводить данные, будет находиться четко над клавиатурой. Так как мне сделать такое же у себя? Если это делается программно, то пожалуйста напишите на Swift, так как диплом пишу на нём.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2015, 14:08     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField?
Посмотрите здесь:

Как сделать эл-книжку для Андроид версии Swift
Как сделать подсчет правильных ответов в викторине? Swift
Как сделать прозрачный TitleBar в окне (MAC OS, XCode, Swift, Cocoa) Swift
Swift Как сохранить введенные данные пользователя в поле TextField нажатием клавиши «done» на клавиатуре?
Swift Textfield деление
Клик по кастом-строке таблицы - переход, не пойму как сделать наличие кнопки back Swift
Как сделать подобное приложение? Swift
Swift Скрыть символы в textField. Запретить ввод менее 6 символов!
Посчитать определенные символы в TextField Swift

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HellBoy4eG
7 / 7 / 1
Регистрация: 15.10.2013
Сообщений: 18
15.05.2015, 11:47     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField? #2
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)
        }
    }
Nikita_Krasnov
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
15.05.2015, 12:00  [ТС]     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField? #3
Спасибо вам большое! я уже подправил некоторые ошибки, осталась только одна, не знаю что с ней делать.
UIWindows.Type does not have a member named 'getEditingViewOnView'.

может это из-за Xcode? у меня стоит 6.2, и допустим вы в некоторых местах ставили восклицательные знаки, а мой Xcode показал что они не нужны.
HellBoy4eG
7 / 7 / 1
Регистрация: 15.10.2013
Сообщений: 18
15.05.2015, 12:34     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField? #4
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;
}
smth
176 / 45 / 6
Регистрация: 23.06.2011
Сообщений: 245
15.05.2015, 18:47     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField? #5
Так как редактируемый элемент на экране может быть только 1, который во время редактирования становится first responder - то алгоритм таков:
1) в начале редактирования (при тапе на textfield или textview) надо сохранить ссылку на редактируемое поле. Для этого надо ввести property (хотя я пользуюсь ivar - не люблю свойства плодить). Тип ссылки - UITextField или UITextView. Хотя, я в последнее время использую тупо базовый класс UIView (удобно, когда на одном экране оба типа присутствуют). Узнать начало процесса редактирвоания можно с помощью делегата от соответствующего типа (например TextFieldShouldBeginEditing)
2) в конце редактирования надо просто вызвать ссылкой resignfirstresponder.

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

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

И неважно, swift или objective c. Алгоритм одинаков, а переписать с одного языка на другой данный пример - раз плюнуть.
Yandex
Объявления
15.05.2015, 18:47     Как сделать сдвиг контента в UIScrollView при вводе данных в TextField?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru