2011-06-22 43 views
4

绘制线我用下面的代码用手势

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(绿色的),像添加视图作为副视点下面的图片

我只好旁观How to draw graphics in iphone gesture?

但我不能它适用于在panRecognizer功能的子视图,特别是DrawInRect方法

(移动)我想用

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];从来没有打电话或火灾的drawRect有关该

任何建议

+0

它看起来像你的holderView可能是一个UIScrollView。如果是这样的话,这会更困难。你是否也可以发布你的'drawRect:'方法 - 当我们看不到有问题的代码时,很难提供帮助。 – RyanR

+0

我更新了我的问题 – AMH

+0

我试过[imageView setNeedsDisplay];但它不起作用 – AMH

回答

4

图像视图作为子视图借鉴了架视图顶部的任何建议或帮助。 imageview是不透明的。这意味着,当绘制视图时,没有持有人视图的实际可见部分,因此drawRect呼叫被优化了。

尝试按照其他方式排列视图,以便持有者视图是imageview的子视图。然后,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 ,特别是下节“查看层次结构和子视图管理”:

“从外观上看,一个子视图的内容掩盖的全部或部分其父视图的内容“

因此,请尝试将imageview作为父项,请执行如下初始化:

// 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... 

现在,图像视图被绘制,并且持有者视图,其子视图被绘制在其上。现在,当您在holderview上调用setNeedsDisplay时,它将收到一个drawRect:呼叫。

例如,像这样跟踪手势。这可能在你的视图控制器或你的MyHolderView视图子类中;这里的例子是在MyHolderView类使得location1location2实例变量可以方便地与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. 
} 
+0

问题是 - (void)drawRect:(CGRect)矩形永远不会被调用,[holderView setNeedsDisplay]; 从来没有开火它有你的任何建议 – AMH

+0

对不起......在再次阅读问题后,我完全重写了它。祝你好运第二次:) –

+0

我会的,你可以重新发布缩放代码,你只需要删除我需要它,请问你是什么意思,所以它的drawRect调用是优化出来的。 – AMH