Обработка изображений в iOS?

Собственно говоря, делаю маленькое приложение под iOS для тренировки. Идея — у меня есть карта мира, когда юзер нажимает на ту или иную страну, она, допустим, перекрашивается в другой цвет.

Плохая реализация, придуманная мной:

Взять карту, а сверху замостить ее кнопочками (не UIButton, т.к. все-таки хочется, чтобы кнопочка имела контур страны, а не прямоугольник, для этого, погуглив были найдены OBShapedButton). Как только юзер нажимает на кнопку, делать alpha = 0. В это время, под кнопками лежала сама карта, уже разноцветная. Вуаля — мы сменили цвет.

Но в реальности, реализация очень… как сказать, неповоротливая. Если я захочу чтобы страна могла сменить цвет дважды, а может 20 раз, нужно наложить 20 кнопочек.

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

Или может вы предложите какие-нибудь более интересные решения. Большое спасибо.
  • Вопрос задан
  • 3686 просмотров
Пригласить эксперта
Ответы на вопрос 3
Enuriru
@Enuriru
Дизайнер, веб-разработчик
>Проблема заключается в том, как распознать, на какую страну кликнул юзер?

Где-то видел такую реализацию: есть полноцветное изображение и есть его «карта», размерами соответствующая самому изображению. Карта полностью черная и на ней разными цветами нарисованы куски, соответствующие активным областям на исходном изображении. В итоге задача определения области клика сводится к определению цвета пикселя в координатах клика. Соответствия область-цвет прописаны в отдельной структуре.
Ответ написан
dvs
@dvs
Если я правильно понял вашу идею, то Вам стоит посмотреть в стороноу Cocos2d, как советует Enuriru.

Нужет фон (сама карта стран)

На неё кладёте спрайты с вырезанными странами, список которых у Вас в массиве countrySprites.

Клик по стране в данном случае будет определяться не сложно в методе ccTouchBegan:withEvent::

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    CCSprite * newCountry = nil;
    for (CCSprite *sprite in self.countrySprites) {
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
            newCountry = sprite;
            break;
        }
    }


Ну а имея спрайт выделенной страны можете с ним уже делать что угодно: перекрашивать, вращать, заставлять прыгать по экрану.

И, конечно, это заведомо работает быстрее, чем 20 кнопочек.
Ответ написан
Комментировать
egormerkushev
@egormerkushev
iOS разработчик, автор PixelMixel
Зачем 20 кнопок, если можно просто сменять у них 'imageForState' с помощью вашего алгоритма/правила?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы