簡體   English   中英

如何旋轉 CATextLayer 並保持其大小?

[英]How to rotate CATextLayer and preserve it's size?

我有一個自定義視圖,用於標記(在其上繪制線條和其他圖形)。 視圖控制器識別觸摸和手勢並將信息傳遞給視圖,以便它可以正確地繪制自己。 每個圖形都有一個標簽( CATextLayer ),上面有一些圖形信息(例如線長)。

我在視圖控制器中添加了一個旋轉手勢識別器來旋轉這個繪圖視圖。 我想旋轉視圖,但防止標簽旋轉(因此它們相對於超級視圖保持 0.0 度)。 為此,我計算了新繪圖視圖相對於超級視圖的角度,並將標簽的角度屬性設置為負值,以便我可以反向旋轉它們。 例如,視圖旋轉 30 度,然后我將標簽旋轉 -30 度。

在負責繪制圖形和設置標簽的視圖繪制方法中,每次需要重新繪制視圖時,我都會為每個標簽創建新的變換:

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformRotate(transform, self.angle); //self.angle - rotation angle in radians
transform = CGAffineTransformScale(transform, scale, scale); //scale label (need this for pinch gesture, works as expected)
label.transform = transform;

如果我將標簽旋轉 90 度,所有這些東西都會起作用。 如果度數不是 0、90、180 等,標簽的框架會發生變化:縮小或放大,大角度甚至消失。 我明白,當你旋轉矩形時,它的框架應該變大,因為它指向這里: 為什么旋轉 UIImageView 大小會改變?

有沒有辦法防止CATextLayer在旋轉時改變其形狀?

標簽的正常位置: 正常位置

旋轉 90 度時(一切都很好) 90度

旋轉到任意角度(標簽框變形) 放大的標簽

框架不是您在非矩形旋轉后所期望的。

對於您的問題,我看到了三種可能的解決方案:

  1. 計算文本的正確大小,並通過為positionbounds分配適當的值來設置框架。
  2. 如果第一個解決方案沒有幫助,請為每個文本圖層的背景創建一個普通的CALayer
  3. 但是,如果您只旋轉圖像並保持文本圖層的旋轉不變,這應該會容易得多。 您可以通過將文本圖層添加到圖像圖層的超級圖層來實現此目的。 使用此設置,您只需計算旋轉后文本圖層的新位置。

我不確定前兩個解決方案是否可行,我更喜歡第三個。

出現問題是因為我在設置轉換后重置CATextLayer的原點。 根據transform屬性文檔:

當該屬性的值不是恆等變換時,frame 屬性中的值是未定義的,應該被忽略。

要更改圖層的位置,請使用其position屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM