Какао сенсорный вид с несколькими одинаковыми подпредставлениями - PullRequest
0 голосов
/ 12 февраля 2010

У меня первая попытка программирования Cocoa Touch (и одна из первых в Cocoa Touch в целом), и я пишу простую игру для iPhone, хотя этот вопрос касается касания какао в целом.

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

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

  • Должен ли я определить основной вид с массивом подпредставлений, каждое из которых рисует сам и передает события касания? Каждая кнопка должна выполнять стандартные действия, например отображать нажатое состояние при касании и так далее. Существуют ли какие-либо существующие представления контейнеров для такого сценария?

  • Или я должен просто определить один основной вид, который рисует всю полосу и определяет, где происходит касание? Мне кажется, что это плохо спроектированный подход - я не должен программировать код проверки попадания .


Отредактировано для уточнения вопроса

Ответы [ 4 ]

1 голос
/ 12 февраля 2010

Более легкий подход - добавить подслои к слою вашего UIView. Используйте hitTest: для отправки касаний, полученных на UIView, к экземпляру CALayer, который должен его получить.

Если вам нужно больше поведения UIResponder (touchesBegan и т. Д.), Вы можете использовать подпредставления вместо подслоев, поскольку это позволит обрабатывать события непосредственно в объектах, а не отправлять их из центрального респондента. (ваш главный UIView).

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

1 голос
/ 12 февраля 2010

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

И второе по NDA: просто поговорим об iPhone.

1 голос
/ 12 февраля 2010

Если у вас много кнопок и вы хотите делать с ними модные вещи, я рекомендую использовать layer . Ваш UIView будет обрабатывать интерпретацию, какой слой имел касание (тестирование нажатия) и ответьте соответственно. Если все, что вы делаете, - это управление целой связкой кнопок с различными эффектами и анимацией, это может быть более простой маршрут.

Что касается плохой инженерии, совсем нет. Если вы посмотрите на соответствующие руководства, вы увидите, что основная анимация и слои действительно требуют тестирования на попадание (хотя это относительно просто), но это намного чище, чем UIView, который делает весь рисунок, и более эффективно, чем многие подпредставления. Он прекрасно проскальзывает между этими двумя подходами.

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

0 голосов
/ 12 февраля 2010

Вы можете создать свой вид в Интерфейсном Разработчике. Просто перетащите группу UIButton s в поле зрения вашего контроллера.

Чтобы реагировать на события, вы определяете IBAction в вашем контроллере представления и подключаете к нему кнопки.

Это все очень просто. Я действительно советую вам хотя бы пройти через введение в программирование iPhone, которое есть в сети Apple. Он научит вас основам iPhone и Interface Builder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...