0

サブビューを特定のビュー (Bad View) に追加しようとしていますが、必要な場所の少し右側に常に表示されます (画面上の x 値が異なります)。

ただし、このサブビューを別のビュー (Good View) に追加すると、正しい位置に配置されることに気付きました。

Bad View と Good View は同じビューの子であり、同じフレームを持ちます (Good View はスクロール ビューのズーム可能なビューですが、Bad View はズームしないオーバーレイ ビューです)。

次のコードを実行します。

view.frame = [[self tiledScrollView] tileContainerView].frame;

if ([[[self tiledScrollView] tileContainerView] superview] == [view superview])
{
    NSLog(@"SAME SUPERVIEWS");
}

[[self tiledScrollView] tileContainerView].frame = view.frame;

NSLog(@"FRAME FOR VIEW THAT DISPLAYS INCORRECTLY: %f, %f, %f, %f, \n FRAME FOR VIEW THAT DISPLAYS CORRECTLY: %f, %f, %f, %f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height, [[self tiledScrollView] tileContainerView].frame.origin.x, [[self tiledScrollView] tileContainerView].frame.origin.y, [[self tiledScrollView] tileContainerView].frame.size.width, [[self tiledScrollView] tileContainerView].frame.size.height);

その直後に、サブビューを [[self tiledScrollView] tileContainerView] (Good View) または view (Bad View) に追加します。

Good View では、ラベルは希望する場所に表示されます。Bad View では、ラベルが少し右側に表示されます。

上記のコードからの出力は次のとおりです。

同じスーパービュー

正しく表示されないビューのフレーム: 0.000275、0.000000、983.999451、648.282349、正しく表示されるビューのフレーム: 0.000293、-0.000003、983.999390、648.282349

したがって、それらは実際にはまったく同じフレームを持っているわけではありません (直前にそれらを等しく設定しましたが) が、それらは非常に近く、丸めとの違いが発生する唯一の場所は origin.y の値ですが、アプリケーションがruns は origin.x 値にあります。

私はこれを理解しようとして多くの時間を無駄にしてきたので、助けていただければ幸いです

4

2 に答える 2

0

ビューframeは、そのスーパービューの座標系における境界矩形です。起こり得ることの 1 つは、Bad View と Good View の座標系が異なることです。これにより、サブビューが画面上のさまざまな場所に表示される理由を簡単に説明できます。チェックする簡単な方法はbounds、の代わりに for each ビューをログに記録することframeです。bounds独自の座標系でビューの境界四角形を提供します。それらが同じでない場合は、問題の原因が見つかりました。

于 2012-06-22T02:49:59.453 に答える
0

代わりに試してください

[[self tiledScrollView] tileContainerView].frame = view.frame;

これ

[[self tiledScrollView] tileContainerView].frame.origin.x    = view.frame.origin.x;
[[self tiledScrollView] tileContainerView].frame.origin.y    = view.frame.origin.y;
[[self tiledScrollView] tileContainerView].frame.size.width  = view.frame.size.width;
[[self tiledScrollView] tileContainerView].frame.size.height = view.frame.size.height;

またはあなたの出力から見ると逆に、出力はview.frameが間違っていることを示しています:

view.frame.origin.x    = [[self tiledScrollView] tileContainerView].frame.origin.x;
view.frame.origin.y    = [[self tiledScrollView] tileContainerView].frame.origin.y;
view.frame.size.width  = [[self tiledScrollView] tileContainerView].frame.size.width;
view.frame.size.height = [[self tiledScrollView] tileContainerView].frame.size.height;
于 2012-06-22T00:56:33.537 に答える