2009-10-15 50 views
1

我正在尝试在UIView周围创建一个包含UIImageView子视图的"marching ants" (an animated dashed line) selection indicator。周围绘制了UIView的周边的虚线是微不足道的使用核心图形:如何防止或补偿缩放核心图形路径的变换?

-(void) drawSelectedMarquee{ 
    CGContextRef c=UIGraphicsGetCurrentContext(); 
CGContextSetStrokeColorWithColor(c, [[UIColor whiteColor] CGColor]); 
CGRect f=self.bounds; 
CGContextSetLineWidth(c, 2.0); 
CGFloat dashes[]={1,2}; 
CGContextSetLineDash(c, 0, dashes, 2); 
CGContextBeginPath(c); 
CGContextAddRect(c, f); 
CGContextStrokePath(c); 
} 

然而,我需要扩展(和旋转)使用仿射视图变换,使得UIImageView的内部可以被缩放和旋转:

-(void) scaleByX:(CGFloat) xScale andY:(CGFloat) yScale{ 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.1]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
self.transform=CGAffineTransformScale(self.transform, xScale, yScale); 
[UIView commitAnimations]; 
} 

然而,由于芯的图形绘制,其中显然是由变换以及缩放,缩放视图相对的“用户空间中的点”导致的虚线是按比例的比例。所以,随着视图缩小,线条越来越细,虚线越来越接近,视线越来越大,线条越来越粗,虚线彼此分开。

作为一个界面元素,选择框应该保持固定的宽度和固定大小的破折号。我试过只是旋转和缩放主视图的UIImageView子视图,但这会导致UIImageView伸缩出超视图。

我可以想出一些暴力方法来正确绘制字幕。我可以跟踪视图的绝对大小,然后在每次重绘时重新计算最终用户空间单位,或者每次使用UIImageView创建一个带选择框的新视图。但这些解决方案不够优雅并且容易出错。

我想我错过了关于如何在UIViews中绘制和转换图形的文档。

[更新:我已经决定在iPhone的小屏幕上使用游动蚂蚁没有用,所以我采用了另一种方法。不过,我仍然对这个问题的解决方案感兴趣。]

回答

2

我不认为你错过了文档中的任何东西,而是你可能错过了缩放比例提供的想法。如果您缩放视图或图层的内容,它将调整内容中的所有内容。这实际上是可取的。它可以轻松扩展,而无需管理所有的子视图缩放。听起来你需要的是在你的视图前添加一个覆盖图层。

我不知道你是如何导致你的视图调整大小,但是当你的视图加载时,添加一个覆盖核心动画层,你可以调整视图缩放比例。注意我在引用叠加层时使用了resize这个词而不是缩放。

要正确地进行这项工作,你必须确保覆盖层是同级你正在扩大,而不是一个孩子,否则它会被缩放以及视图。

有趣的是,您可以使用CAShapeLayer并利用其lineDashPattern属性,该属性使用浮点数组来指定可以勾勒出您指定的CGRect的短划线模式。然后可以使用lineDashPhase属性和一个CABasicAnimation为该模式提供行进中的蚂蚁效果。如果你感兴趣,我可以详细说明这一点。

更新:我继续和wrote a blog post on getting the marching ants effect working using Core Animation。对不起,我没有时间来解决你的问题,但博客文章可能会帮助你指出正确的方向。

+0

我会看看Core Animation解决方案。使用重叠视图或图层时遇到的问题是,包含图像视图的视图的框架在图像缩放时必须增大和缩小。任何用作叠加的独立视图也是如此。将图像与图像的比例同步会产生明显的伪影。希望CA层不会有这个问题。 – TechZen 2009-10-17 15:03:16

+0

我打算继续接受这个答案,因为我不认为有可能做到我原本想做的事情。这个答案在相同的问题空间中提供了非常有用的信息。 – TechZen 2009-10-30 19:45:27

0

我认为你可以逆转换来做你想做的事。如果我错了,你应该能够构建相反的转换,如果你知道你的规模和翻译价值。

另一种方法是绘制到图层上,而不是直接绘制到视图中,只缩放图层。

在许多应用程序(如Adobe Illustrator)中,选框矩形实际上是主窗口的透明窗口。

1

你可能想要检查内核的图形绘制视图的contentMode。我最近遇到了一个问题,那就是在变长高的tableview单元格中有垂直虚线,这些单元格的缩放方式与您所描述的类似。如果将contentMode设置为UIViewContentModeRedraw,则应该在帧更改时使用drawRect手动绘制视图,而不是缩放它。