Как рисовать и взаимодействовать с UIBezierPath - PullRequest
1 голос
/ 22 июня 2011

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

Я планирую использовать UIBezierPath для рисования фигур. Каждый UIBezierPath будет представлять магазин на моей карте. Вот иллюстрация ( map_with_UIBezierPath )

Моя структура кода следующая: у меня есть UIViewController и UiView. В методе "viewDidLoad" UIViewController я создаю экземпляр UIView, а в методе "drawRect" UIView я рисую фигуры, как показано ниже (UIBezierPathExtension наследуется от UIBezierPath):

- (void)drawRect:(CGRect)rect {

context = UIGraphicsGetCurrentContext();

[[UIColor grayColor] setFill]; 
    [[UIColor greenColor] setStroke];

UIBezierPathExtension *aPath = [[UIBezierPathExtension alloc] init]; 
aPath.pathId = 1;
    [aPath moveToPoint:CGPointMake(227,34.25)];
[aPath addLineToPoint:CGPointMake(298.25,34.75)];
[aPath addLineToPoint:CGPointMake(298.5,82.5)];
[aPath addLineToPoint:CGPointMake(251,83)];
[aPath addLineToPoint:CGPointMake(251,67.5)];
[aPath addLineToPoint:CGPointMake(227.25,66.75)];   
    [aPath closePath]; 
aPath.lineWidth = 2;
[aPath fill]; 
[aPath stroke];
[paths addObject:aPath];

UIBezierPathExtension* aPath2 = [[UIBezierPathExtension alloc] init];
aPath2.pathId = 2;
[aPath2 moveToPoint:CGPointMake(251.25,90.5)];
[aPath2 addLineToPoint:CGPointMake(250.75,83.25)];
[aPath2 addLineToPoint:CGPointMake(298.5,83)];
[aPath2 addLineToPoint:CGPointMake(298.5,90.25)];
[aPath2 closePath];
aPath2.lineWidth = 2;
[aPath2 fill]; 
[aPath2 stroke];
[paths addObject:aPath2];   

    ...
}

Я также реализовал жест панорамирования и пинча в UIViewController.

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

Может кто-нибудь сказать мне правильное направление?

Спасибо заранее

1 Ответ

2 голосов
/ 26 июня 2011

Вам нужно искать сенсорные события (TouchesBegan, TouchesMoved, TouchesEnded, TouchesCancelled) в вашем представлении.Когда вы получаете прикосновение, вы можете спросить его о его местонахождении в вашем представлении.Вы можете использовать это местоположение, чтобы проверить, находится ли эта точка внутри какого-либо из ваших путей, если это так, делать свои крутые вещи.

Используя ваш пример кода, здесь может быть грубый TouchesBegan ...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint pointTouched = [touch locationInView:self];
        for (UIBezierPath *path in paths) {
            if ([path containsPoint:point]) {
                // do something cool with your path
                // or more likely, set a flag to do the cool thing when drawing
            }
        }
    }
}

Не забывайте, что вы должны обрабатывать все сенсорные события и делать с ними что-то разумное.Кроме того, приведенный выше код поддерживает мультитач, но вы можете разрешить только одно касание, в этом случае есть способы устранить цикл «касания».

...