2016-05-20 90 views
4

我有一個矩形視圖,其中包含以編程方式繪製的垂直細線。iOS - 如何繪製拖動時用戶觸摸的線條上的點

這是我用於繪製線的代碼:

- (void)drawLines 
{ 
    CGFloat spacing = _bgView.frame.size.width/11.0f; 

    for(int i = 1; i < 11; i++) 
    { 
     UIView *line = [[UIView alloc] initWithFrame:CGRectMake((CGFloat)(i * spacing), 0, 1, _bgView.frame.size.height)]; 
     line.backgroundColor = [UIColor whiteColor]; 
     line.tag = i; 

     [_bgView addSubview:line]; 
    } 
} 

該線由從矩形視圖(_bgView)的寬度計算平均分配空格分隔。

這裏是什麼樣子的概述:

enter image description here

當用戶在矩形視圖中拖動,當他/她的手指穿過或觸及一條線,一個點會在那個特定的點上繪製。

以下代碼檢測用戶在線上的觸摸點,並在該點上繪製一個點。

- (IBAction)drawDots:(id)sender 
{ 
    UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)sender; 

    CGPoint pannedPoint = [pan locationInView:_bgView]; 

    for (UIView *subview in _bgView.subviews) 
    { 
     if (CGRectContainsPoint(subview.frame, pannedPoint) && subview.tag > 0) 
     { 
      NSLog(@"Point x:%.2f y:%.2f TAG:%i", pannedPoint.x, pannedPoint.y, subview.tag); 

      UIView *point = [[UIView alloc] initWithFrame:CGRectMake(pannedPoint.x - 2.5, pannedPoint.y - 2.5, 5, 5)]; 
       point.backgroundColor = [UIColor redColor]; 

      [_bgView addSubview:point]; 
     } 
    } 
} 

現在,如果用戶鍋真快,這將是結果:

enter image description here

可以看出,只有一些點繪製,這就是爲什麼有很多缺失在其他線上的點。

這應該是預期的結果:

enter image description here

但是,出現這種情況只有當用戶鍋超慢。

即使手指移動速度非常快,我如何在用戶觸摸時截取的線條中繪製點?

謝謝!

+0

你可以使用委託方法,將之前調用平移手勢的動作 –

+0

@PKT謝謝!我會試一試。 –

+0

@PKT嗨,我只想問,你是指UIGestureRecognizerDelegate?如果是這樣,那麼我沒有看到我可以使用的任何委託方法。 –

回答

1

相反,你應該用UIResponder的方法來檢測用戶的平移手勢的觸摸:

- touchesBegan:withEvent: 
- touchesMoved:withEvent: 
- touchesEnded:withEvent: 
- touchesCancelled:withEvent: 

第二種方法 - touchesMoved:withEvent:方法調用時,用戶保持通過屏幕上移動的手指,這樣你就可以得到它的手指位置:

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint touchLocation = [touch locationInView:touch.view];  

然後只需添加您的檢測邏輯。

詳細信息請參考文檔: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/

+0

謝謝!我會嘗試的。 –

+0

嗨,它不像我期望的那樣工作。結果與我現在面臨的情況相同。 –

1

請參閱該代碼

您的需求

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

// NSLog(@"DEBUG: Touches moved"); 

[super touchesMoved:touches withEvent:event]; 

if ([[event allTouches] count] > 1) { 

} else { 

    UITouch *touch = [[event allTouches] anyObject]; 
    UIView *view = touch.view; 


    NSLog(@"DEBUG: Touches Moved"); 

    CGPoint location = [touch locationInView:self.bgView]; 
    for (UIView *subview in _bgView.subviews) 
    { 
     if (CGRectContainsPoint(subview.frame, location) && subview.tag > 0) { 

      NSLog(@"Point x:%.2f y:%.2f TAG:%i", location.x, location.y, subview.tag); 

      UIView *point = [[UIView alloc] initWithFrame:CGRectMake(location.x - 2.5, location.y - 2.5, 5, 5)]; 
      point.backgroundColor = [UIColor redColor]; 

      [_bgView addSubview:point]; 

     } 


    } 





    } 
} 

將幫助您

+0

什麼是imageView?這是否代表線? –

+0

這只是一個例子,我在屏幕上移動圖像視圖 –

+0

該代碼有效,但仍然與我所寫的代碼沒有什麼不同。當用戶快速繪製時,很多點不能被檢測到。 –

相關問題