2009-10-15 33 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手動繪製視圖,而不是縮放它。

相關問題