我正在尝试在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的小屏幕上使用游动蚂蚁没有用,所以我采用了另一种方法。不过,我仍然对这个问题的解决方案感兴趣。]
我会看看Core Animation解决方案。使用重叠视图或图层时遇到的问题是,包含图像视图的视图的框架在图像缩放时必须增大和缩小。任何用作叠加的独立视图也是如此。将图像与图像的比例同步会产生明显的伪影。希望CA层不会有这个问题。 – TechZen 2009-10-17 15:03:16
我打算继续接受这个答案,因为我不认为有可能做到我原本想做的事情。这个答案在相同的问题空间中提供了非常有用的信息。 – TechZen 2009-10-30 19:45:27