我正在嘗試在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