Вопрос

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

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

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

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

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


Отредактировано, чтобы прояснить вопрос

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Вы можете создать макет своего представления в Interface Builder.Просто перетащите кучу UIButtons в представлении вашего view controller.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top