gpt4 book ai didi

ios - 检查用户何时滑过 UIView - touchesMoved 太滞后

转载 作者:行者123 更新时间:2023-12-01 19:12:39 25 4
gpt4 key购买 nike

我知道有更好的方法可以使用 CoreGraphics 来实现绘图工具,我正在使用这种 UIView 方法,因为我想实现像素化效果,并且我想到了一些其他自定义的东西,这些东西很难用内置CG代码。

我有一个包含 400 个 UIView 的网格来创建我的像素 Canvas ......
用户选择一种油漆颜色并开始在 400 个 UIView 的 Canvas 上拖动手指,当他们的手指碰到 UIView 时,该 UIView 的颜色(又名像素)将变为用户选择的颜色......
现在我已经编写了整个代码并且一切正常,但是它很滞后(因为我使用的是 touchesMoved)并且很多点都被跳过了......

我目前正在使用 touchesMoved 并将 UIView 移动到手指位置(我称之为 fingerLocationRect )。

当我更新像素(400 个微型 UIView 中的 1 个)颜色时,我通过检查 fingerLocationRect是我的任何一个 UIView 矩形的交集。如果他们是我更新颜色。

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint currentPosition = [touch locationInView:self.view];
fingerLocationRect.center = CGPointMake(currentPosition.x, currentPosition.y);
int tagID = 1;
while (tagID <= 400) {
if(CGRectIntersectsRect(fingerLocationRect.frame, [drawingView viewWithTag:tagID].frame)) {
[drawingView viewWithTag:tagID].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f];
}
tagID ++;
}
}

问题是 touchesMoved 不会经常更新......所以如果我在 Canvas 上拖动手指,只有 5 个像素发生变化,而不是我实际触摸的 40 个。

我想知道是否使用 CGRectIntersectsRecttouchesMoved是检测用户是否滑动 UIView 的最佳方法......现在它的更新速度不够快,我得到的是左边的结果而不是右边的结果。 (如果我非常缓慢地移动手指,我只能达到右侧的效果......)

enter image description here

综上所述,除了使用 touchesMoved 之外,是否有一种方法可以检测用户何时滑过 UIView? ?如果没有,关于如何在 touchesMoved 返回的触摸位置之间获取所有 UIView 的任何想法?我让它们都有 1-400 的标签(第一行是 1-10,第二行是 11-21,等等)

附:如果是 panGestureRecognizertouchesMoved 更频繁地更新?

为了了解这 400 个 UIView 的样子,它们都带有 arc4random。基于颜色:

enter image description here

最佳答案

每次调用 touchesMoved: 时,您都在循环 400 个 View 。您只需要做一些数学运算来确定网格中的哪个 View 被触摸。假设 drawingView 是包含所有 400 个“像素”的“ Canvas ” View ,并且标签从左上角到右下角排序,则:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:drawingView];
NSInteger column = floorf(20 * point.x / drawingView.bounds.size.width); //20 is the number of column in the canvas
NSInteger row = floorf(20 * point.y / drawingView.bounds.size.height); //20 is the number of rows in the canvas
[viewWithTag:column + 20*row].backgroundColor = [UIColor colorWithRed:redVal/255.f green:greenVal/255.f blue:blueVal/255.f alpha:1.f];
}

这种方法性能改进将允许 cocoa 更频繁地调用 touchesMoved:

关于ios - 检查用户何时滑过 UIView - touchesMoved 太滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15425167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com