Как нарисовать гладкую прямую линию с помощью UIBezierPath? - PullRequest
1 голос
/ 14 ноября 2011

Я хочу, чтобы можно было рисовать прямые линии на экране iPad с помощью UIBezierPath.Как бы я поступил об этом?

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

Далее, если я дважды коснусь конечной точки, должна начаться новая строка.

Есть ли какие-либо ресурсы, которые я могу использовать для руководства?

1 Ответ

8 голосов
/ 14 ноября 2011
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:startOfLine];
[path addLineToPoint:endOfLine];
[path stroke];

Справочник по классам UIBezierPath

РЕДАКТИРОВАТЬ

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create an array to store line points
    self.linePoints = [NSMutableArray array];

    // Create double tap gesture recognizer
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    [doubleTap setNumberOfTapsRequired:2];
    [self.view addGestureRecognizer:doubleTap];
}

- (void)handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateRecognized) {

        CGPoint touchPoint = [sender locationInView:sender.view];

        // If touch is within range of previous start/end points, use that point.
        for (NSValue *pointValue in linePoints) {
            CGPoint linePoint = [pointValue CGPointValue];
            CGFloat distanceFromTouch = sqrtf(powf((touchPoint.x - linePoint.x), 2) + powf((touchPoint.y - linePoint.y), 2));
            if (distanceFromTouch < MAX_TOUCH_DISTANCE) {    // Say, MAX_TOUCH_DISTANCE = 20.0f, for example...
                touchPoint = linePoint;
            }
        }

        // Draw the line:
        // If no start point yet specified...
        if (!currentPath) {
            currentPath = [UIBezierPath bezierPath];
            [currentPath moveToPoint:touchPoint];
        }

        // If start point already specified...
        else { 
            [currentPath addLineToPoint:touchPoint];
            [currentPath stroke];
            currentPath = nil;
        }

        // Hold onto this point
        [linePoints addObject:[NSValue valueWithCGPoint:touchPoint]];
    }
}

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

...