0

UINavigationBar と UIScrollView を含む ViewController があります。スクロール ビュー内に、ページング タイプのものを作成するために他のビューを配置しています。私はこれを完全に機能させましたが、UIScrollView 内のすべての座標値が 2 倍になっているにもかかわらず、要素が .frame.origin で正しい座標を返すという非常に奇妙なことを回避する必要がありました。

これがなぜなのかわからず、検索しても何も見つからなかったので、間違っているに違いないと思い、テストを実行しました。

上記のシナリオを作成しましたが、背景に 10x10 ピクセル グリッドの測定画像を配置しました。viewController の viewDidLoad でこれを実行しました。

[super viewDidLoad];
// Size to fit the screen
float height = [[UIScreen mainScreen] bounds].size.height;
height -= [UIApplication sharedApplication].statusBarFrame.size.height;
height -= self.navBar.frame.origin.y;
height -= self.navBar.frame.size.height;
CGRect frame = self.scrollView.frame;
frame.size.height = height;
self.scrollView.frame = frame;

frame.origin.y = 10;
testUIView *testView = [[testUIView alloc] initWithFrame:frame];
[self.scrollView addSubview:testView];

結果は私の最も暗い恐怖を確認しました。グリッドは、10 ピクセルの 2 つのブロックを示す testView の下に表示されます。値は確かに 2 倍になっていますが、これはなぜですか?どうすればよいでしょうか?

[編集]

興味深いことに、挿入されるビューのコードは次のとおりです。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [[NSBundle mainBundle] loadNibNamed:@"testUIView" owner:self options:nil];

        self.view.frame = frame;

        [self addSubview:self.view];
        [self.spinner startAnimating];
    }
    return self;
}
4

2 に答える 2

1

コードからは、何かが「2 倍になっている」と判断する方法が不明ですが、その理由はほぼ確実に、ポイントとピクセルを混同していて、Retina デバイスで実行しているためです。

ほとんどすべての座標 (特に 内のものCGPoint) はポイントで与えられます。Retina ディスプレイでは、ポイントごとに 4 ピクセル (2 行 x 2 列) があります。これは と呼ばscaleれ、Retina ディスプレイの場合は「2」です。詳細については、ビューでの高解像度画面のサポートを参照してください。

于 2013-03-17T20:42:18.287 に答える
1

ここでの教訓は、「注意深く観察すること」と「詳細を省かないこと」です。

initWithFrame では、フレームが xib からの IBOutlet であるサブビューに直接適用されるため、x 値と y 値が 2 倍になります。フレームを変更せずに追加すると、x 値と y 値がビューの座標空間内に保持されます。したがって、ビューは親の y=10 に表示され、サブビューはビューの y=10 に表示され、サブビューを y=20 に配置するレイアウトになります。

解決策: サブビューに適用する前に、フレームの原点をリセットします。

とんがり帽子の時間です!

于 2013-03-18T13:01:06.690 に答える