web-dev-qa-db-ja.com

サイズを維持しながらUIViewを中心の周りで回転させます

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;

enter image description here

ありがとう!

50
Diego Acosta

おそらく、Autolayoutで問題が発生しています。おそらく、スーパービューの端に固定する回転ビューに制約があります。変換が適用されると、自動レイアウトはビューのサイズをスーパービュー内に収まるように更新します。

さまざまな制約を試すことができます(たとえば、ビューの中心を別のビューの中心に固定し、幅と高さを一定の値に固定する)、または回転したビューの自動レイアウトをオフにします。ニーズに合わない、Autolayoutの下にレイアウトされたコンテナビューを使用し、Autolayoutを使用せずにこれに回転ビューを追加します。

これはコードでのみ行うことができます-translatesAutoresizingMasksIntoConstraintsNO(自動レイアウトオン)またはYES(自動レイアウトオフ)に設定することにより、個々のビューを自動レイアウトの対象とすることができます。ビューを一方から他方に切り替える場合は、適切な自動サイズ変更マスクを設定する必要があります。

27
jrturton

必要でない限り、マクロの使用は避けます。これは完璧に機能します

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

Swift + extensionは友達です!

// MARK: - UIView Extension -

extension UIView {

    /**
     Rotate a view by specified degrees

     - parameter angle: angle in degrees
     */
    func rotate(angle 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)
26
Luca Davanzo

Luca Davanzoの回答をSwift 4:

/**
 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
}
17
Bill Chan

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);

[〜#〜] edit [〜#〜]:可能であれば、達成したい種類の変換(アニメーション/無生物、単一/反復)を共有します。私はこれを行うためのより良い、最適化された方法があるかもしれないと信じています。

12
n00bProgrammer

このコードで試してください:

#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);
6
Abhinav

スイフト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
    }
}
4
Sunkas

オンSwift 3:

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

rotationAngleに関するドキュメントのこの特定の部分のため、-90を使用しています。CGAffineTransformに渡す必要があります。

このマトリックスが座標系の軸を回転させる角度(ラジアン単位)。 iOSでは、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。

2
Bruno Delgado

私の考えでは、三角形の中心を計算し、この点を中心に回転する必要があります。次に、正方形の中心を軸に矢印を回転させます。

参照: ポイントを中心とした回転のためのワンステップアフィン変換?

私はそれがあなたを助けることを願っています。

0
Sauvage