1

UIScrollViewWWDC2010 セッション 104 に続いて、10000 x 8078 ピクセルの画像用にCATiledLayer を作成しました。

フレームに問題があります &zoomScaleビューが最初に最上位に表示されるとき

  1. セッション104のように、私levelsOfDetailは4と定義しました
  2. 私の drawRect で私が呼び出すCGFloat lScale = CGContextGetCTM(lContext).a;

不思議なことに、実行時に lScale には 0.124907158 が割り当てられます。予想される 0.125 ではありません。

同様に、rect渡されるにdrawRectは、次のような浮動小数点値があります。

  • rect.origin.x = 4099.04443
  • rect.origin.y = 6144
  • rect.size.width = 2049.52222
  • rect.size.height = 2048

私にとって最もイライラするのは、0x0 原点を使用しCATiledLayerて tiledImageView を作成したにもかかわらず、フレームが原点 0 x 26.93 を示していることです。initWithFrame

これの原因となる計算を見つけることができるアイデアはありますか?


編集: 奇妙なフレーム位置のソースが見つかりました。これは、ScrollView の境界が 450 px に誤って設定されていることです。420 ピクセルにする必要があります。UIScrollView の layoutSubview ルーチンには、誤って y 座標を調整するセンター ビュー ルーチンがあります。

4

2 に答える 2

1

私はこれに対する治療法を見つけました。

WWDC 2010 セッション 104 サンプルにはUIScrollView、ビューの動作を制御する 2 つのメソッドがあります。

1つ目はconfigureForImageSize、ズームスケールが設定されている以前に投稿した回答で言及したことです。

説明された浮動小数点の違いにより、imageView 境界は、前に強調表示された小数で生成されます (wx/hx または wy/hy を参照)。

これをきれいにするためにlayoutSubviews、ビュー フレームを計算する場所のオーバーライドを使用しました。

- (void) layoutSubviews {
    [super layoutSubviews];

    CGSize lBoundsSize = self.bounds.size;
    CGRect lFrameToCenter = imageView.frame;

    // cure to the decimals problem
    lFrameToCenter.size.width  = roundf(lFrameToCenter.size.width);
    lFrameToCenter.size.height = roundf(lFrameToCenter.size.height);

    if (lFrameToCenter.size.width < lBoundsSize.width)
        lFrameToCenter.origin.x = (lBoundsSize.width - lFrameToCenter.size.width) / 2;
    else
        lFrameToCenter.origin.x = 0;

    if (lFrameToCenter.size.height < lBoundsSize.height)
        lFrameToCenter.origin.y = (lBoundsSize.height - lFrameToCenter.size.height) / 2;
    else
        lFrameToCenter.origin.y = 0;

    imageView.frame = lFrameToCenter;

    if ([imageView isKindOfClass:[tileView class]]) {
        imageView.contentScaleFactor = 1.0;
    }
}

他の処理を行う前に、フレーム サイズを丸めていることに注意してください。

于 2011-01-06T06:23:21.893 に答える
0

バグ分析をもう少し進めました。

mImageSizeが10000x8078および320x450の境界である場合、セッション104の例の計算を次のようUIScrollViewに使用しました。configureForImageSize

- (void) configureForImageSize:(CGSize)mImageSize  {
    CGSize lBoundsSize = [self bounds].size;

    // set up our content size and min/max zoomscale
    CGFloat lXScale = lBoundsSize.width / mImageSize.width;    // the scale needed to perfectly fit the image width-wise
    CGFloat lYScale = lBoundsSize.height / mImageSize.height;  // the scale needed to perfectly fit the image height-wise

    // debug values
    float wx = mImageSize.width  * lXScale;
    float wy = mImageSize.width  * lYScale;
    float hx = mImageSize.height * lXScale;
    float hy = mImageSize.height * lYScale;

    ...
}

デバッガーは次の値を表示します。

* mImageSize = width 10000 height 8078
* bounds size: width 320 height 450
* lXScale = 0.0396137647
* lYScale = 0.0450000018
* wx = 320
* wy = 363.51001
* hx = 396.137634
* hy = 450.000031

だから私は境界に関連して画像サイズを収集し、フロートポイントの計算の違いにつながります。が生成されるときCATiledLayer、境界は常に浮動小数点値です。

それが原因である場合、画像のサイズを変更せずにこれを数学的に解決するにはどうすればよいですか(醜い考え)???

于 2011-01-05T09:04:04.193 に答える