CATiledLayer получает неправильное значение frame & contextCTM.a (zoomScale) - PullRequest
1 голос
/ 04 января 2011

после сессии WWDC2010 104 Я только что создал CATiledLayer в UIScrollView для изображения 10000 x 8078 px.

У меня проблемы с рамкой & 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

Самое неприятное для меня то, что рамка CATiledLayer показывает начало координат 0 x 26,93, хотя я создал tiledImageView, используя initWithFrame, используя источник 0x0.

Любые идеи, где я могу найти расчет, который отвечает за это?


EDIT: Я нашел источник для странной позиции кадра, то есть границы ScrollView, которые были неправильно установлены в 450 пикселей. это должно быть 420 пикселей. Подпрограмма layoutSubview в UIScrollView имеет подпрограмму центрального вида, которая непреднамеренно корректировала координату y.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Я нашел лекарство от этого.

Образец сеанса 104 WWDC 2010 содержит два UIScrollView метода, которые управляют поведением представления.

Первый - это 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;
    }
}

Обратите внимание, что я округляю размер кадра, прежде чем делать с ним что-нибудь еще!

0 голосов
/ 05 января 2011

Я немного продвинулся в анализе ошибок.

Имея mImageSize 10000x8078 и 320x450 Bounds в UIScrollView Я использовал вычисления configureForImageSize из примера сессии 104 следующим образом:

- (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, границы - это всегда значения с плавающей точкой.

Если это причина, как я могу получить математический выход из этого, не изменяя размер изображения (безобразная мысль) ???

...