Нарисуйте линию жестом - PullRequest
4 голосов
/ 22 июня 2011

Я добавляю вид как вспомогательный вид, используя следующий код

    imageview = [[UIImageView alloc] initWithFrame:[holderView frame]];
    [imageview setImage:cppobject->OutputImage];
    imageview.contentMode = UIViewContentModeScaleAspectFit;

    [holderView addSubview:imageview];
    holderView.contentMode = UIViewContentModeScaleAspectFit ;

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
    [pinchRecognizer setDelegate:self];
    [holderView addGestureRecognizer:pinchRecognizer];
    [pinchRecognizer release];

    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
    [rotationRecognizer setDelegate:self];
    [holderView addGestureRecognizer:rotationRecognizer];
    [rotationRecognizer release];

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    [panRecognizer setDelegate:self];
    [holderView addGestureRecognizer:panRecognizer];
    [panRecognizer release];

-(void)scale:(id)sender {
}

-(void)rotate:(id)sender {
}

-(void)move:(id)sender {
}

-(void)tapped:(id)sender {
}

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

Я смотрел на Как рисовать графику в жесте iphone?

Но я не смог применить его к подпредставлению, особенно метод DrawInRect

в функции panRecognizer (перемещение) Я хочу нарисовать линию, используя

    UIPanGestureRecognizer *gR = (UIPanGestureRecognizer *) sender ; 
    NSValue *value = [NSValue valueWithCGPoint: [gR locationInView:gR.view]]; 
    [Points addObject:value];
    [holderView setNeedsDisplay];

    NSLog(@"End of measuring") ; 

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

-(void)drawRect:(CGRect)rect { 
  NSLog(@"Entered Draw In Rect");
  if (Measuring) {
    [[UIColor redColor] setStroke];
    UIBezierPath *pathToDraw = [UIBezierPath bezierPath]; 

    for (int n = 1; n < [Points count] - 1 ; n++) { 
      NSValue * value = [Points objectAtIndex:(NSInteger)n];
      CGPoint  point = [value CGPointValue]; 
      [pathToDraw moveToPoint:point];
      value = [Points objectAtIndex:(NSInteger)n+1];
      point = [value CGPointValue];
      [pathToDraw addLineToPoint:point];
    }
    [pathToDraw stroke];
  }
}

проблема в том, что [holderView setNeedsDisplay]; никогда не звоните или не обращайте внимание на любые предложения или помощь относительно этого

любое предложение

1 Ответ

4 голосов
/ 27 июня 2011

Представление изображения, являющееся подпредставлением, рисует поверх представления держателя.Изображение является непрозрачным.Это означает, что при отрисовке видов не будет видимой части вида держателя, поэтому его вызов drawRect оптимизирован.

Попробуйте упорядочить виды наоборот, чтобы держательview - это подпредставление imageview.Затем будет отображен вид изображения, а поверх него будет отображен вид держателя.

Кроме того, обратите внимание, что вы должны использовать границы родительского вида в качестве рамки подпредставления.

UIView* subview = [[UIView alloc] initWithFrame:[parentview bounds]];

Редактировать (добавить):

См. http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html%23//apple_ref/doc/uid/TP40009503-CH2-SW1, в частности, в разделе «Просмотр иерархий и управление подпредставлением»:

«Визуально содержимое подпредставления скрывает полностью или частичносодержимого его родительского представления "

Итак, попробуйте сделать родительский просмотр изображения, выполните инициализацию следующим образом:

// instance variables:
UIImageView* imageView;
MyHolderView* holderView;

imageView = [[UIImageView alloc] initWithFrame:mainRect];
holderView = [[MyHolderView alloc] initWithFrame:[imageView bounds]];
holderView.opaque = NO;
holderView.backgroundColor = [UIColor clearColor];
[imageView addSubview:holderView];

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:holderView action:@selector(scale:)];
[pinchRecognizer setDelegate:self];
[holderView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];

// etc...

Теперь представление изображения рисуется и представление держателя, его подпредставление нарисовано поверх него.Теперь, когда вы вызываете setNeedsDisplay для владельца, он получает вызов drawRect:.

Например, отслеживайте жест следующим образом.Это может быть в вашем контроллере представления или в вашем подклассе представления MyHolderView;пример здесь будет в классе MyHolderView, так что переменные экземпляра location1 и location2 могут быть легко использованы совместно с методом drawRect: .:

-(void)scale:(id)sender {
  if (sender == pinchRecognizer) { // this allows the responder to work with multiple gestures if required
    // get position of touches, for example:
    NSUInteger num_touches = [pinchRecognizer numberOfTouches];

    // save locations to some instance variables, like `CGPoint location1, location2;`
    if (num_touches >= 1) {
      location1 = [pinchRecognizer locationOfTouch:0 inView:holderView];
    }
    if (num_touches >= 2) {
      location2 = [pinchRecognizer locationOfTouch:1 inView:holderView];
    }

    // tell the view to redraw.
    [holderView setNeedsDisplay];
  }
}

, а затем в подпрограмме drawRect представления держателя:

-(void)drawRect:(CGRect)rect {

  // use instance variables location1 and location2 to draw the line.
}
...