Пользовательский UITextField/UIButton

Я пытаюсь воспроизвести NSTokenField, например UITextField, видимый в приложении «Почта» и приложении «Сообщения» (введите контакт, и он предложит предложения).

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

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

Мой первый вопрос: как я могу добавить этот теневой вид в UITableView? Похоже, он утонул за UITextField.

Во-вторых, я знаю, что мне придется создать подкласс UITextField, чтобы он выглядел так, как мне хотелось бы, но я понятия не имею, с чего начать. Некоторые указатели или образец были бы замечательными!

Наконец, я думаю, мне нужно создать собственный UIButton с пространством для текста и синим градиентом, а затем добавить его в UITextField. Та же проблема, что и с UITextField, не совсем уверен, как создать подкласс UIButton (какие методы ему нужно рисовать и прочее) или как добавить его в UITextField таким образом, чтобы при нажатии на клавишу Backspace в UITextField кнопка быть выделен, а затем удален, если снова щелкнуть клавишу Backspace (именно так работает NSTokenField).

Я включил изображение, чтобы вы могли понять, о чем я говорю: http://www.thermoglobalnuclearwar.com/stuff/mail.jpg

Я взглянул на проект Joe Hewitts Three20, но не смог понять ни головы, ни хвоста. Я хотел бы начать очень просто и понять все, что происходит, а не просто перетаскивать его код в свой и не иметь ни малейшего представления о том, что происходит!

Любая помощь приветствуется!

Спасибо, Том.


person Tom Irving    schedule 22.10.2009    source источник


Ответы (2)


Рассматривали ли вы возможность использования библиотеки Three20? Он содержит элемент управления, который, я думаю, делает то, что вы хотите (TTPickerTextView).

Как указано в описании сайта

TTPickerTextField — это UITextField с опережением ввода. По мере ввода он ищет источник данных и добавляет пузыри в поток текста, когда вы выбираете вариант опережающего ввода. Я использую это в TTMessageController для выбора имен получателей сообщений.

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

person Christopher Fairbairn    schedule 22.10.2009
comment
Я пробовал его несколько раз, но, как я уже сказал выше, я не мог им воспользоваться. Все является подклассом подкласса и рисует с подклассом подкласса. Все, что мне действительно нужно знать, это как очень просто создать подкласс UIButton и UITextField и как переопределить метод рисования для каждого из них, чтобы я мог сделать это сам. Я могу перейти к более сложным вещам позже. - person Tom Irving; 23.10.2009

Хорошо, у меня есть тень, работающая под UITextField, и я добавил к ней метку «Кому:». Это здорово выглядит!

Итак, последнее — это синий элемент управления, похожий на NSToken. Я начал думать, что проще всего просто создать подкласс UIView и нарисовать внутри него синий градиент и метку. Что подводит меня к еще нескольким вопросам:

Я нашел это: http://github.com/leonho/iphone-libs/tree/master, который рисует красивый округлый вид, и я адаптировал его, чтобы добавить к нему текст, а не число, но я не знаю, как это сделать, это нарисовать градиент вместо сплошного блока цвета.

После этого остается только добавить закругленные представления в UITextField, переместить курсор и решить, как удалить представления, когда курсор достигает их, но я займусь этим, когда мне понадобится.

person Tom Irving    schedule 26.10.2009
comment
Вы можете добавить свое собственное представление в качестве дочернего элемента UITextField, используя следующее сообщение [textField addSubview:customView]; Упомянутый в другом месте класс TTPickerTextField демонстрирует один из способов выполнения остальных требуемых задач (таких как обработка ввода с клавиатуры, выделение и т. д.). Чтобы создать собственный класс UITextField, используйте диалоговое окно нового файла XCode, чтобы добавить новый класс, производный от NSObject, а затем замените NSObject на UITextField в файле заголовка. В Interface Builder вы можете изменить идентификатор вашего UITextField на MyCustomTextField, используя окно инспектора. - person Christopher Fairbairn; 27.10.2009
comment
Спасибо. Должен ли я тогда добавлять все методы UITextField в пользовательский класс, или они вызываются автоматически, потому что это просто подкласс? - person Tom Irving; 27.10.2009
comment
Привет, ты закончил проект? Я работаю над достижением того же эффекта. - person Chintan Patel; 30.04.2010
comment
Своего рода, я закончил тем, что создал версию, предназначенную для моего приложения, а не что-то, что можно было бы добавить в любой проект, есть ли что-то конкретное, с чем вам нужна помощь? - person Tom Irving; 30.04.2010
comment
Я хочу иметь такой же эффект отображения имени контакта в текстовом поле и полного удаления имени, если пользователь нажимает кнопку «Назад». Я попытаюсь сделать это с помощью вышеупомянутой библиотеки и свяжусь с вами, если не смогу этого сделать. :) - person Chintan Patel; 03.05.2010
comment
Глядя на код iphone-libs, я не думаю, что смогу добиться того, что вы указываете как UIButton на скриншоте. Three20 имеет тот же эффект, что и я, в форме TTPickerTextField, но, как вы сказали, его подкласс структуры подкласса меня озадачивает, и я думаю, что мне придется импортировать всю структуру, чтобы просто иметь TTPickerTextField. Будем держать вас в курсе. :) - person Chintan Patel; 03.05.2010
comment
В конце концов я использовал подкласс UIScrollView для содержания элементов управления, подкласс UITextField для переопределения editRectForBounds и подкласс UIView для рисования синего элемента управления, похожего на кнопку. Я заставил его реагировать на события касания, чтобы он вел себя как кнопка. - person Tom Irving; 03.05.2010
comment
Итак, после 2 дней попыток самостоятельно я сдаюсь. Мне очень понравится, если вы поделитесь своим кодом, чтобы сделать это, потому что в противном случае у меня нет другого выбора, кроме как импортировать весь фреймворк Three20 только для этой функциональности. Спасибо. :) - person Chintan Patel; 05.05.2010
comment
Это может помочь опубликовать конкретные вещи, с которыми у вас возникли проблемы. Мой код является частью целого, а не просто контроль над его одиночеством, и я не хочу делиться всем проектом. - person Tom Irving; 05.05.2010
comment
Я не могу добавить UIButtons с текстом имени пользователя в UITextField. Если я добавлю кнопки в качестве подвидов в текстовое поле, кнопки не реагируют на курсор. Попросил проект, потому что вы упомянули в своем ответе, что поделитесь проектом, когда закончите. В любом случае, спасибо за ваше время. :) - person Chintan Patel; 06.05.2010
comment
Свяжитесь со мной, используя контактную форму на моем веб-сайте, и я лучше объясню, что вам нужно сделать, чтобы все заработало. Форматирование комментариев здесь менее чем полезно. - person Tom Irving; 06.05.2010