Не удается коснуться UITextField в UIScrollView

Я знаю, что об этом много говорили. Я думаю, что я рассмотрел все вопросы на этом сайте, и до сих пор не смог заставить это работать.

Я новичок в разработке, но хорошо понимаю, что происходит со всем моим кодом. У меня определенно нет большого опыта, это мое первое приложение для iPhone.

Я создаю поле ввода данных, состоящее из нескольких UITextField в UIScrollView. Я пока не буду объяснять другие детали, так как это кажется очень простой проблемой. Без прокрутки текстовые поля работают отлично. Я могу коснуться текстового поля, и клавиатура или окно выбора отобразятся соответствующим образом. Когда я добавляю текстовые поля в прокрутку, прокрутка работает, но текстовые поля не получают мои касания.
Вот ключ: когда «Взаимодействие пользователя» ВКЛЮЧЕНО, прокрутка работает, но касания текстового поля НЕ регистрируются. . Когда «Взаимодействие с пользователем» ОТКЛЮЧЕНО, прокрутка не работает, но текстовое поле касается ЗАРЕГИСТРИРОВАНО, и появляется клавиатура/выборщик.

Из других постов я видел людей, создающих подклассы и переопределяющих штрихи в отдельной реализации. Я видел людей, использующих настраиваемые представления контента (подпредставления?), я видел некоторые решения, которые сейчас устарели, поскольку API-интерфейсы изменились в более новых версиях SDK, и я просто полностью застрял.

Я пока оставлю свой код, потому что, возможно, у кого-то есть решение, не требующее моего кода. Если кому-то нужно увидеть мой код, я его выложу. Мое приложение написано в SDK 3.1.3.

Если у кого-то есть ЛЮБАЯ информация, которая может помочь, это было бы очень признательно.


person Chris B    schedule 21.04.2010    source источник


Ответы (3)


Вот что у меня сработало в Xcode 4.3.3.

В раскадровке выберите свой scrollview. Выберите Attribute Inspector справа. Снимите флажок Delays Content Touches.

person bbb    schedule 14.09.2012
comment
Большое спасибо! это должен быть правильный ответ, я сделал это и, наконец, сработал!!! действительно очень большое спасибо! - person Stephy Samaniego; 27.09.2019

Похоже, вы используете IB для большей части своего макета пользовательского интерфейса. Если вы используете программный подход, вы можете настроить следующую иерархию представлений, которая должна работать.

Ваш объект контроллера представления, управляющий вашим представлением прокрутки и вашими текстовыми полями, должен иметь объект UIScrollView и объект UIView (в дополнение к любым объектам UITextField, которые вам нужны). В методе loadView класса контроллера представления выделите и инициализируйте объект UIView и добавьте к нему текстовые поля в качестве подвидов. В конце метода выделите и инициализируйте объект UIScrollView, затем добавьте UIView к UIScrollView в качестве подпредставления.

Например, если ваш объект UIScrollView называется scrollView, а ваш объект UIView называется mainView, следующие строки в конце метода loadView контроллера представления правильно настроят представление прокрутки с основным представлением с текстовыми полями на нем:

scrollView = [[UIScrollView alloc] initWithFrame: [[UIScreen mainScreen] bounds] ];
scrollView.backgroundColor = [UIColor whiteColor];
scrollView.contentSize = mainView.frame.size;
[scrollView addSubview: mainView];
self.view = scrollView;
person GWdoppler    schedule 22.07.2010

При необходимости вам может потребоваться включить / отключить взаимодействие с пользователем как для просмотра прокрутки, так и для текстовых полей.

Если возможно, вам лучше всего использовать разные сенсорные механизмы для каждого процесса (прокрутка и ввод текстового поля).

Возможно, вы можете проверить разницу во времени между началом и окончанием касания, чтобы вы могли обнаружить разницу между перетаскиванием (прокруткой) и касанием (вводом текста).

Сказав, что если вы распространяете штрихи из текстовых полей в прокрутку, у вас все будет хорошо. Я использую одну вещь:

[myObject addTarget:self action:@selector(itemTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];

который передает затронутый объект, чтобы вы могли идентифицировать его и действовать соответственно.

person ader    schedule 10.01.2012