パン、ピンチ、回転 UIGestureRecognizers を使用して、ユーザーが特定の UI 要素を必要な場所に正確に配置できるようにしています。ここからのコードを使用http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more (またはここからの同様のコードhttp://mobile.tutsplus.com/ tutorials/iphone/uigesturerecognizer/ ) 両方とも、ユーザーがこれらの UI 要素を必要に応じて配置するために必要なものを提供してくれます。
ユーザーが「UI レイアウト」モードを終了すると、UIView の変換と中央を次のように保存します。
NSString *transformString = NSStringFromCGAffineTransform(self.transform);
[[NSUserDefaults standardUserDefaults] setObject:transformString forKey:@"UItransform", suffix]];
NSString *centerString = NSStringFromCGPoint(self.center);
[[NSUserDefaults standardUserDefaults] setObject:centerString forKey:@"UIcenter"];
アプリをリロードすると、UIView の変換と中央が次のように読み取られます。
NSString *centerString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIcenter"];
if( centerString != nil )
self.center = CGPointFromString(centerString);
NSString *transformString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UItransform"];
if( transformString != nil )
self.transform = CGAffineTransformFromString(transformString);
そして、UIView は正しく回転およびスケーリングされますが、間違った場所に配置されます。さらに、「UI レイアウト」モードに再び入ると、さまざまなジェスチャで常にビューを取得できるとは限りません (表示されるビューがジェスチャ認識エンジンによって理解されるビューではないかのように)。
また、UIViewtransform
を ID に設定するリセット ボタンもありcenter
、NIB から読み込まれたときの状態に設定されます。しかし、変更された UIView センターと変換をロードした後、リセットしても機能しません。UIView の位置が間違っています。
私が最初に考えたのは、これらのジェスチャ コードの例が変更されているためcenter
、回転は異なる中心の周りで発生しているに違いないということでした (移動、回転、スケールの予測不可能なシーケンスを想定しています)。編集のシーケンス全体を保存したくないので (レイアウト モードで元に戻す機能が必要な場合は便利かもしれませんが)、変換を使用して移動するように UIPanGestureRecognizer ハンドラーを変更しました。それが機能するようになったら、変換を保存するだけで、物事がどのような順序で起こったかに関係なく、現在の位置と方向が得られると考えました。しかし、そのような幸運はありません。私はまだこの方法で奇抜な位置を取得します。
だから私は途方に暮れています。UIView が移動され、新しい位置に回転された場合、後でロードして UIView をあるべき場所に戻すことができるように、その場所と向きを保存するにはどうすればよいですか?
この権利をタグ付けしなかった場合、正しくレイアウトしなかった場合、または他のスタックオーバーフローの罪を犯した場合は、事前に謝罪してください。ここに投稿するのは初めてです。
編集
これまでのところ、2つの提案を試しています。それらは事実上同じものだと思います(1つはフレームを保存することを提案し、もう1つは原点を保存することを提案します。これはframe.originだと思います)。
したがって、設定コードからの保存/読み込みコードには次のものが含まれます。
保存:
NSString *originString = NSStringFromCGPoint(self.frame.origin);
[[NSUserDefaults standardUserDefaults] setObject:originString forKey:@"UIorigin"];
読み込み (変換を読み込む前):
NSString *originString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIorigin"];
if( originString ) {
CGPoint origin = CGPointFromString(originString);
self.frame = CGRectMake(origin.x, origin.y, self.frame.size.width, self.frame.size.height);
}
私は同じ(または似たような - 分かりにくい)結果を得ます。実際、設定をリロードするだけのボタンを追加しました。ビューが回転すると、その「リロード」ボタンはUIViewをオフセットで繰り返し移動します(フレームまたは変換がそれ自体に関連しているかのように-私は確信しています)は手がかりですが、それが何を指しているのかわかりません)。
編集#2
これは、ビューのframe
. Apple http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW6 (強調鉱山) から:
ビューの変換にスケーリングまたは回転係数が追加されている場合でも、center プロパティの値は常に有効です。ビューの変換が恒等変換と等しくない場合、フレーム プロパティの値は無効と見なされます。
編集#3
さて、設定を読み込んでいるときは、すべて問題ないようです。UI パネルのbounds
rect は {{0, 0}, {506, 254}} です。私の VC の viewDidLoad メソッドの最後では、すべて問題ないようです。しかし、実際に物が表示されるまでにbounds
は、別のものがあります。例: {{0, 0}, {488.321, 435.981}} (これは、回転およびスケーリングされた後のスーパービュー内の大きさのように見えます)。境界を本来あるべき状態にリセットすると、元の位置に戻ります。
プログラムで境界を本来あるべき状態にリセットするのは簡単ですが、実際にはいつそれを行うべきかわかりません! 私はviewDidLoadの最後にそれをやろうと思っていたでしょうが、bounds
その時点ではまだ正しいです。
編集#4
私は(NIBから来ているように)initWithCoderでself.boundsをキャプチャしてから、layoutSubviewsでself.boundsをそのキャプチャされたCGRectにリセットしようとしました。そして、それは機能します。
しかし、それは恐ろしくハックで、危険に満ちているようです。これは本当に正しい方法ではありません。(できますか?) 以下の skram の回答は非常に単純に見えますが、アプリをリロードすると機能しません。