我有一个“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
}
答案 0 :(得分:0)
您是否检查了路径中实际有多少点?我不认为你想逐个像素地绘制你的CGPath。相反,您应该只在距离超过某个阈值时添加一个段。您还可以通过点绘制曲线而不是绘制线段来简化路径。请参阅此primer on bezier curves。
编辑:Ray Wenderlich sample app看起来实际上在做同样的事情,在TouchedMoved中添加点数。然而,在touchesEnded中,它们将曲线栅格化为位图。我不太确定这会对你的情况有所帮助,因为看起来你正在删除touchesEnded中的所有点。我仍然会看看他们的代码,看看你是否还有其他任何可以成为瓶颈的观点。
答案 1 :(得分:0)
你有什么影响?您是尝试让用户使用笔跟踪线条和曲线,还是点击它们点?
简单的事实是,iOS不够快,无法逐点跟踪用户的笔/笔划。相反,您希望收集一系列点并创建一个UIBezierPath,将这些点与线段连接起来。这会给你一些非常接近你想要的东西。但是,如果用户跟踪速度很快,那么也会落后。