CATiledLayer得到一个错误的框架& contextCTM.a值(zoomScale)

时间:2011-01-04 08:35:23

标签: iphone uiscrollview catiledlayer

在WWDC2010 Session 104之后,我刚刚在UIScrollView内为10000 x 8078像素图像创建了一个CATiledLayer。

我对框架&当视图首次显示在顶层时,zoomScale

  1. 与会话104一样,我将levelsOfDetail定义为4
  2. 在我的drawRect中,我致电CGFloat lScale = CGContextGetCTM(lContext).a;
  3. 奇怪的是在运行时lScale被赋予0.124907158,而不是预期的0.125。

    传递给rect的{​​{1}}也有浮点值,例如

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

    对我来说最令人恼火的是drawRect的框架显示原点为0 x 26.93,即使我使用{0}原点创建了使用CATiledLayer的tilesImageView。

    我能找到对此负责的计算的任何想法吗?


    修改 我找到了奇怪的帧位置的源,这是ScrollView边界被错误地设置为450像素。应该是420像素。 UIScrollView中的layoutSubview例程有一个中心视图例程,无意中调整了y坐标。

2 个答案:

答案 0 :(得分:1)

我找到了治愈方法。

WWDC 2010会话104示例具有两个控制视图行为的UIScrollView方法。

第一个是我在之前发布的答案中提到的configureForImageSize,其中设置了缩放比例。

由于解释的浮点差异,imageView-bounds会生成前面突出显示的小数(请参阅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;
    }
}

请注意,在对其进行任何其他操作之前,我会对框架尺寸进行四舍五入!

答案 1 :(得分:0)

我的错误分析得到了进一步的发展。

UIScrollView中的mImageSize为10000x8078和320x450 Bounds我使用了会话104示例中的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时,边界总是浮点值。

如果这是原因,我怎样才能从中获得数学方法而不必调整图像大小(丑陋的想法)?