Как перетащить линию в IOS с помощью UIPanGestureRecognizer - PullRequest
0 голосов
/ 11 ноября 2011

Я пишу программу, в которой пользователь будет перетаскивать строку из одного UILabel в другой. Я создал подкласс UIView с именем DragView и переопределил метод drawRect. Я сделал UIView подпредставлением RootController представления. DragView определенно виден, метод drawRect определенно вызывается, но строка не видна.

Это (что я думаю) соответствующие части кода.

//DragView.m

- (void)drawRect:(CGRect)rect
{
    if (context == nil)
    {
        context = UIGraphicsGetCurrentContext();
    }

    if (_drawLineFlag)
    {

        CGContextSetLineWidth(context,2.0); 
        CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
        CGFloat components[] = {0.0,0.0,1.0,1.0};
        CGColorRef color = CGColorCreate(colorspace, components);

        CGContextSetStrokeColorWithColor(context,color);

        CGContextMoveToPoint(context,_startX, _startY);

        CGContextAddLineToPoint(context,_currentX,_currentY);

        CGContextStrokePath(context);   
    } 
}    

DrawProgramAppDelegate

- (void) initializeUI
{
.....

    dragView = [[DragView alloc] initWithFrame:CGRectMake(0.0f,0.0f,1024.0f,768.0f)] ;
    [view addSubview: dragView];
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self  action:@selector(handlePan:)];
    [dragView addGestureRecognizer:panGestureRecognizer];
.....

}

Обработчик события:

- (void) handlePan:(UIPanGestureRecognizer *) recognizer             
{
    CGPoint point = [recognizer translationInView:dragView];

    [dragView setCurrentX:point.x];
    [dragView setCurrentY:point.y];
    [dragView setDrawLineFlag:YES];

    [view bringSubviewToFront:drawView];
    [dragView drawRect:CGRectMake (0.0f,0.0f,768.0f, 1024.0f)];
}

Большое спасибо за вашу помощь.

Jon

1 Ответ

1 голос
/ 12 ноября 2011

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

CGContextMoveToPoint(context,_startX, _startY);
CGContextAddLineToPoint(context,_currentX,_currentY);

, учитывая частоту звонка, проведет только крошечную линию.

Вы не должны вызывать drawRect:

[dragView drawRect:CGRectMake (0.0f,0.0f,768.0f, 1024.0f)];

Вы должны сообщить системе, что представление должно отображаться

[dragView setNeedsDisplay];

Также вы должны проверить состояние распознавателя жестов, определенное как

typedef enum {
   UIGestureRecognizerStatePossible,
   UIGestureRecognizerStateBegan,
   UIGestureRecognizerStateChanged,
   UIGestureRecognizerStateEnded,
   UIGestureRecognizerStateCancelled,
   UIGestureRecognizerStateFailed,
   UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
} UIGestureRecognizerState;

И, возможно, только рисовать, если состояние UIGestureRecognizerStateChanged или UIGestureRecognizerStateEnded

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