在WWDC2010 Session 104之后,我刚刚在UIScrollView
内为10000 x 8078像素图像创建了一个CATiledLayer。
我对框架&当视图首次显示在顶层时,zoomScale
levelsOfDetail
定义为4 CGFloat lScale = CGContextGetCTM(lContext).a;
奇怪的是在运行时lScale被赋予0.124907158,而不是预期的0.125。
传递给rect
的{{1}}也有浮点值,例如
对我来说最令人恼火的是drawRect
的框架显示原点为0 x 26.93,即使我使用{0}原点创建了使用CATiledLayer
的tilesImageView。
我能找到对此负责的计算的任何想法吗?
修改 我找到了奇怪的帧位置的源,这是ScrollView边界被错误地设置为450像素。应该是420像素。 UIScrollView中的layoutSubview例程有一个中心视图例程,无意中调整了y坐标。
答案 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
时,边界总是浮点值。
如果这是原因,我怎样才能从中获得数学方法而不必调整图像大小(丑陋的想法)?