6

CGAffineTransformRotate を使用して UIImageView 制約を中心に回転させようとしていますが、回転中にビューが揺れます。CATransform3DRotate を使用してレイヤーを回転させると、これは発生しませんが、制約を編集 (定数を変更) するとすぐに、回転した画像が飛び出します。この問題を解決する方法を知っている人はいますか?

これは飛び去った回転した画像のスクリーンショットですここに画像の説明を入力

4

3 に答える 3

10

自動レイアウトは、UIView のフレームに作用します。フレームは、ビューの中心、境界、および変換プロパティから計算されます。デフォルトでは、view.transform は単なる CGAffineTransformIdentity であり、この構成では、フレームは、ビューの境界と同じ幅と高さを持つ、スーパービューと同じ向きの長方形です。

ただし、view.transform (または同等の view.layer.transform) を変更すると、中心、境界、およびフレームの間の予測可能な関係が壊れます。たとえば、変換が 20 度の回転である場合、フレームの幅と高さは境界と同じではなくなります。フレームは(私が思うに...)スーパービューと同じ向きの長方形になり、現在20度回転している元の長方形を含める必要があります。

また、自動レイアウトはフレーム プロパティに作用するため、望ましくないレイアウトが生成される可能性があります。

たとえば、ビューが 10x10 フレームの長方形内に円を表示するとします。この円は、スペースの制約によってスーパービューの左上に配置されます。次に、それを 45 度回転させます。回転した円は同じように見えます。しかし、フレームは、回転した元の長方形を含むことができる最小の長方形であり、この最小の長方形は 10/sqrt(2) x 10/sqrt(2) です。自動レイアウトがこの新しいフレームに左上の配置を適用すると、円が下に移動し、右に移動するのがわかります。視覚的に {5,5} の中心ではなく、{5/sqrt(2),5/sqrt(2)} の中心になります。

これに対する救済策は、レイアウト制約の「定数」パラメーターを手動で調整して変換の効果を修正するか、同様にalignmentRectForFrameをオーバーライドして、変換を補正するために調整されたalignmentRectで自動レイアウトを強制的に機能させることだと思います、または変換の影響を受けない可能性のあるビューの中心にバインドする元の制約を定義します。

于 2012-11-24T15:08:24.577 に答える
3

この問題についてのエッセイをここに書いたところです。

自動レイアウトが使用されている場合、CALayerのアンカーポイントを調整するにはどうすればよいですか?

私の結論は、自動レイアウトとビュー変換は一緒にうまく機能しないということです。2つの解決策を示します。(a)適用する変換に対して反撃しない制約のみを使用するか、(b)制約を使用せず、translatesAutoresizingMaskプロパティをYESに設定して、ビューを自動レイアウトから完全に除外します。このビューでは、自動レイアウト前と同じように機能します。

于 2013-01-01T16:20:53.843 に答える
1

Apple サポート チームから連絡があり、Superview の layoutSubviews を上書きすることで、問題の解決策を提供してくれました。これにより、特定のビューに特別なレイアウトを適用できます。これは完璧な解決策ではないかもしれませんが、魔法のように機能し、Apple が提案したので、Autolayout を実装したエンジニアからのものであれば、良い解決策になるはずです。

ここでより完全な回答を追加しました-同様の質問です。

于 2013-01-02T08:28:04.647 に答える