令人困惑的滞后情况 - UIBezierPath重新划线太过sla

时间:2017-11-25 21:55:18

标签: ios objective-c iphone uiview

我有一个“SLATE2”平板电脑,可以让我在平板电脑上用特殊笔书写,并与我自己的应用程序进行交互。我遇到了一些麻烦,我不认为这是硬件问题。

- (void)touchesBegan: (CGPoint)point
{
    [path moveToPoint:point];
}

- (void)touchesMoved: (CGPoint)point
{
    [path addLineToPoint: point]; // (4)
    [Newpath appendPath: path];
    pathTwo = [UIBezierPath bezierPath];
    pathTwo = [UIBezierPath bezierPathWithCGPath:Newpath.CGPath];
    pathTwo = [pathTwo fitInto: self.bounds];
    [self setNeedsDisplay];
}

- (void)touchesEnded: (CGPoint)point
{
    pathTwo = [UIBezierPath bezierPath];
    pathTwo = [UIBezierPath bezierPathWithCGPath:Newpath.CGPath];
    pathTwo = [pathTwo fitInto: self.bounds];
    [path removeAllPoints];
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    [[UIColor whiteColor] setStroke];
    [pathTwo stroke];
    return;
}

UIView屏幕的绘图太慢了。我正在看控制台,实际平板电脑引发的事件几乎是光速。如果有更好的方法可以更快地利用这个UIView,请告诉我。

我已经解决了这个问题。 fitInto被频繁调用,每次都会重新绘制pathTwo。我需要fitInto每次都被调用一个垫子的新部分,它被绘制以缩放显示的数量。

我尝试关闭抗锯齿,但这不起作用。

fitInto就是这样......

想象一下iphone的屏幕 如果你要在平板电脑上画一个方形平板电脑,在底部,说一个圆圈,如果你画一个圆圈,它只会放大iphone屏幕,因为它是平板电脑上唯一的图形。如果您在平板电脑的顶部绘制,由于两个相对的末端,底部的圆圈现在显示为整个平板电脑的比例。我认为这个功能不会更快......但是试试吧!

  func fit(into:CGRect) -> Self {
    let bounds = self.cgPath.boundingBox

    let sw     = into.size.width/bounds.width
    let sh     = into.size.height/bounds.height


    let factor = min (5, min(sw, max(sh, 0.0)))

    return scale(x: factor, y: factor, into: into)
  }

这里是比例

 func scale(x:CGFloat, y:CGFloat, into: CGRect? = nil) -> Self{
    var transform = CGAffineTransform(scaleX: x, y: y)

    if into != nil {
      transform = transform.concatenating(CGAffineTransform(translationX: into!.midX - self.cgPath.boundingBox.midX, y: into!.midY - self.cgPath.boundingBox.midY))
    }
    let _ = applyCentered(transform: transform)

    return self
  }

2 个答案:

答案 0 :(得分:0)

您是否检查了路径中实际有多少点?我不认为你想逐个像素地绘制你的CGPath。相反,您应该只在距离超过某个阈值时添加一个段。您还可以通过点绘制曲线而不是绘制线段来简化路径。请参阅此primer on bezier curves

编辑Ray Wenderlich sample app看起来实际上在做同样的事情,在TouchedMoved中添加点数。然而,在touchesEnded中,它们将曲线栅格化为位图。我不太确定这会对你的情况有所帮助,因为看起来你正在删除touchesEnded中的所有点。我仍然会看看他们的代码,看看你是否还有其他任何可以成为瓶颈的观点。

答案 1 :(得分:0)

你有什么影响?您是尝试让用户使用笔跟踪线条和曲线,还是点击它们点?

简单的事实是,iOS不够快,无法逐点跟踪用户的笔/笔划。相反,您希望收集一系列点并创建一个UIBezierPath,将这些点与线段连接起来。这会给你一些非常接近你想要的东西。但是,如果用户跟踪速度很快,那么也会落后。