2011-01-04 7 views
1

WWDC2010セッション104 10000 x 8078 pxイメージの場合、UIScrollView内にCATiledLayerを作成しました。CATiledLayerが正しくないフレーム&contextCTM.a値(zoomScale)を取得しました

ビューは、セッション104で私はCGFloat lScale = CGContextGetCTM(lContext).a; を呼び出して、私のdrawRectで4

  • としてlevelsOfDetailをそのトップレベル

    1. で最初のショーに定義されるようにするとき、私はフレーム& zoomScaleで困っています

      実行時にlScaleに0.124907158が割り当てられますが、予想通り0.125には割り当てられません。

      同様drawRectに渡さrectは、

      • rect.origin.x = 4099.04443
      • rect.origin.y = 6144
      • rect.size.width = 2049.52222としてfloatpoint値を有します
      • rect.size.height = 2048

      私のためにほとんど刺激性のそのフレームであります私が0x30の原点を使用してinitWithFrameを使用してtiledImageViewを作成したにもかかわらず、は原点0 x 26.93を示しています。

      私はこれに責任がある計算を見つけることができる任意のアイデアですか?


      EDIT: IはScrollViewの境界が誤って450ピクセルに設定されている奇妙なフレーム位置、のソースを発見しました。それは420ピクセルでなければなりません。 UIScrollViewのlayoutSubviewルーチンには、誤ってy座標を調整した中心ビュールーチンがあります。

  • 答えて

    1

    これに対して治療法が見つかりました。

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

    最初はconfigureForImageSizeですが、以前に投稿された回答ではズーム倍率が設定されています。

    説明されている浮動小数点の違いのために、imageView-boundsは前にハイライト表示された小数点以下で生成されます(wx/hxまたはwy/hyを参照)。私はそれで何かを行う前に、フレームのサイズを丸める

    - (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; 
        } 
    } 
    

    注:

    が得る私はビューフレームを計算layoutSubviewsのオーバーライドを使用し、これをクリーンアップするには!

    +0

    私は何時間も苦労してきた問題を解決しました。 :-)私は完璧に動作するCATiledLayerを持っていましたが、位置(フレーム)を変更しようとすると、スケール値が突然変化しました。 0.5〜0.49756である。私はあなたのソリューションを試して、CATiledLayerの幅と高さを丸めました。あなた自身が見つけたソリューションを共有してくれてありがとう。 :-) –

    +0

    さて、問題は修正されましたが、別のものが導入されました。 UIScrollViewをズームインすると、UIScrollViewに対してCATiledLayerのサイズが正しくないことがわかります。 CATiledLayerはUIScrollViewを完全に埋めていないので、右端と下端が黒くなり、UIScrollViewの背景色を見ることができるので、これを見ることができます。それは、場合によっては大丈夫かもしれませんが、残念ながら私の中にはありません。おそらくスケール自体を丸めて、別のものを試してみる必要があります。 –

    0

    私のバグ分析ではもう少しだ。そう

    * 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 
    

    - (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; 
    
        ... 
    } 
    

    デバッガは、以下の値を示しています。次のようにUIScrollViewに10000x8078及び320x450境界のmImageSizeを有する

    Iはセッション104例からconfigureForImageSize計算を使用しました私は境界に関連してイメージのサイズを集めるので、浮動小数点計算の違いにつながります。 CATiledLayerが生成されると、境界は常に浮動小数点値になります。

    これが原因であれば、イメージのサイズを変更することなく、数学的な方法をどのように得ることができますか(醜い考え)???

    +0

    幅と高さを四捨五入しても、まだ0.249921のような奇妙な尺度で、適切なタイルを見つけることができません。これをどうやって解決するのですか? – Matthew

    関連する問題