4

我想在点击屏幕的地方画一条垂直线。因为平均手指宽于 1 像素宽,所以我想“分步”执行此操作。所以基本上,这条线只能每25px绘制一次。我想找出我可以画一条线的最近位置。

例如,如果手指从我的上视图左侧轻敲 30 像素,我想从视图左侧画一条 25 像素的垂直线。如果从左侧点击屏幕 40 像素,我希望从左侧绘制 50 像素的线。(所以每 25 个像素只能有一条线,我想画最近的一条。

知道我该怎么做吗?

画线很简单:

UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(100.0, 0.0, 1, 320.0)];
lineView.backgroundColor = [UIColor whiteColor];
[parentView addSubview:lineView];

但我不知道如何找到用户点击屏幕的位置。

4

4 回答 4

1

要选择与 25 点边界对齐的最近垂直线,请使用它来计算正确的 x 值:

CGFloat   spacing = 25.0f;
NSInteger lineNumber = (NSInteger)((touchPoint.x + (spacing / 2.0f)) / spacing);
CGFloat   snapX = spacing * lineNumber;

以下是上面代码中发生的情况:

  1. 将一半的间距值添加到触摸点上 - 这是因为下一步中的“捕捉”过程将始终找到一行,因此通过添加一半的间距值,我们确保它将“捕捉”到最近的行。
  2. 通过除以间距并将值转换为整数来计算行号。这会截断结果的小数部分,因此我们现在有了整数行号(0、1、2、3 等)。
  3. 乘以原始间距,得到您要绘制的线的实际 x 值(0、25、50、75 等)。
于 2012-06-17T20:36:14.093 回答
0

您可以使用 ssteinberg 代码:

  UITouch *touch = [touches anyObject];
  CGPoint touchPoint = [touch locationInView:self]; 

或将 UITapGestureRecognizer 添加到您的视图中,这可能更容易:

UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[yourParentView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

...

- (IBAction)handleTap:(UITapGestureRecognizer *)recognizer {
    CGPoint touchPoint = [recognizer locationInView:self.view];

...

此外,每隔 25px 画一条线,添加如下内容:

  CGFloat padding = 25.0;
  NSInteger xPosition = round(touchPoint.x / padding) * padding;
  [self drawLineAt:xPosition];
于 2012-06-17T16:16:10.217 回答
0

创建一个覆盖整个屏幕(状态栏除外)的透明自定义 UIView 并覆盖其(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event.
您可以通过以下方式获得接触点:

  UITouch *touch = [touches anyObject];
  CGPoint touchPoint = [touch locationInView:self]; 
于 2012-06-17T14:08:49.280 回答
0

如果您觉得合适,请参考此:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

if (lineView) {
    [lineView removeFromSuperview];

    NSSet *allTouchesSet = [event allTouches]; 
    NSArray *allTouches = [NSArray arrayWithArray:[allTouchesSet allObjects]];   
    int count = [allTouches count];

    if (count  == 1) {

        UITouch *touch = [[event allTouches] anyObject];
        tapPoint = [touch locationInView:self];
        NSLog(@"tapPoint: %@",NSStringFromCGPoint(tapPoint));

        UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(tapPoint.x, 0.0, 1, 320.0)];
        lineView.backgroundColor = [UIColor whiteColor];
        [parentView addSubview:lineView];


    }
}

}

于 2012-06-22T13:06:39.730 回答