簡體   English   中英

圍繞其中心旋轉 UIView 保持其大小

[英]Rotate UIView around its center keeping its size

我正在嘗試將UIView旋轉幾個弧度,但在應用轉換后,它看起來並沒有保持其大小。 實現這一目標的正確方法是什么?

這是我正在做的和我得到的(帶箭頭的藍色框是我試圖旋轉的視圖——它應該與后面的紅色框保持相同的方面):

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(CGAffineTransformIdentity, rads);
self.arrowView.transform = transform;

在此處輸入圖片說明

謝謝!

除非必要,我避免使用宏。 這很好用

float degrees = 20; //the value in degrees
view.transform = CGAffineTransformMakeRotation(degrees * M_PI/180);

Swift + 擴展是你的朋友!

// MARK: - UIView Extension -

extension UIView {

    /**
     Rotate a view by specified degrees

     - parameter angle: angle in degrees
     */
    func rotate(angle: CGFloat) {
        let radians = angle / 180.0 * CGFloat.pi
        let rotation = CGAffineTransformRotate(self.transform, radians);
        self.transform = rotation
    }

}

這樣,在您的代碼中的任何位置:

let view = UIView(frame: CGRectMake(0, 0, 100, 100))
view.backgroundColor = UIcolor.redColor()
view.rotate(angle: 90)

您可能遇到了 Autolayout 的問題。 您可能對旋轉視圖有限制,將其固定到超級視圖的邊緣。 應用轉換后,Autolayout 會更新視圖的大小以仍然適合超級視圖。

您可以嘗試不同的約束(例如將視圖的中心固定到另一個視圖的中心,並將寬度和高度固定為恆定值)或關閉旋轉視圖的自動布局,或者,如果這些不起作用或不不適合您的需求,請使用在 Autolayout 下布局的容器視圖,並將您的旋轉視圖添加到其中,而不使用 Autolayout。

這只能在代碼中完成 - 您可以通過將translatesAutoresizingMasksIntoConstraints設置為NO (自動布局打開)或YES (自動布局關閉)來使單個視圖服從或不服從自動布局。 如果從一個視圖切換到另一個視圖,則需要設置適當的自動調整大小蒙版。

用 Swift 4 更新 Luca Davanzo 的回答:

/**
 Rotate a view by specified degrees

 - parameter angle: angle in degrees
 */
func rotate(angle: CGFloat) {
    let radians = angle / 180.0 * CGFloat.pi
    let rotation = self.transform.rotated(by: radians)
    self.transform = rotation
}

CGAffineTransformRotate變換從現有的仿射變換旋轉。 您使用CGAffineTransformIdentity的事實可能是問題所在。 您必須指定視圖的當前轉換。

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
...
double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(self.arrowView.transform, rads);
self.arrowView.transform = transform;

此外,您可能需要考慮:

self.arrowView.transform = CGAffineTransformMakeRotation(rads);

編輯:如果可以,請分享您想要實現的轉換類型(動畫/無生命,單/迭代)。 我相信可能有更好的、優化的方法來做到這一點。

斯威夫特 5:

extension UIView {
    func setTransformRotation(toDegrees angleInDegrees: CGFloat) {
        let angleInRadians = angleInDegrees / 180.0 * CGFloat.pi
        let rotation = self.transform.rotated(by: angleInRadians)
        self.transform = rotation
    }
}

嘗試使用此代碼:

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
self.arrowView.layer.transform = CATransform3DMakeRotation(rads, 0, 0, 1);

在 Swift 3 上:

let degrees: CGFloat = -90
let radians = CGFloat(__sinpi(degrees.native/180.0))
view.transform = CGAffineTransform(rotationAngle: radians)

我使用-90是因為您必須傳遞給CGAffineTransform關於rotationAngle的文檔的這一特定部分:

此矩陣旋轉坐標系軸的角度(以弧度為單位)。 在 iOS 中,正值指定逆時針旋轉,負值指定順時針旋轉。

斯威夫特5

將 UIView 倒置

let degrees:CGFloat = -180 //angle to convert upside down
rotatingUI.transform = CGAffineTransform(rotationAngle: degrees * CGFloat(Double.pi)/180);
    

在我看來,您需要計算三角形的中心並圍繞該點旋轉。 現在您圍繞正方形的中心旋轉箭頭。

請參閱: 繞點旋轉的一步仿射變換?

我希望它會幫助你。

暫無
暫無

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

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