使用CATiledLayer,渲染时Tiles之间的细线,使用ImageMagick生成的tile

Dou*_*idt 7 iphone tiles imagemagick uiscrollview catiledlayer

使用Apple和I​​mageMagick的PhotoScroller示例,我设法构建了我的目录应用程序.

但我有一个渲染错误.平铺图像在它们之间用细线渲染.

我使用ImageMagick的简单脚本是这样的:

#!/bin/sh

file_list=`ls | grep JPG`

for i in 100 50 25; do 
 for file in $file_list; do
  convert $file -scale ${i}%x -crop 256x256 -set filename:tile "%[fx:page.x/256]_%[fx:page.y/256]" +repage +adjoin "${file%.*}_${i}_%[filename:tile].${file#*.}"
 done
done
Run Code Online (Sandbox Code Playgroud)

Apple的代码是一样的.奇怪的是,他们提供的图像已经平铺,就像一个魅力,在同一个运行时间,与我的图像并排:(

我的第一个猜测是,磁贴的大小与代码上的计算不匹配,但更改大小无法修复,无论是在我的脚本还是在代码中.我的图像通常比苹果提供的图像小,实际上只有一半.

有人有同样的问题吗?

Dan*_*ser 9

我有两个解决方案的问题.Damien的方法并没有完全消除所有缩放比例的线条,布伦特的解决方案删除了​​线条,但在瓷砖边框添加了一些文物.

谷歌搜索了一段时间后,我终于找到了一个对我很好的解决方案:http://openradar.appspot.com/8503490(由zephyr.renner评论).

毕竟,Apple的假设CTM.a == CTM.d似乎根本不"安全"......


Dam*_*bin 8

我在这里使用PhotoScroller代码有完全相同的问题.问题出现,何时scale不对- (void)drawRect:(CGRect)rect.

你需要圆形scale...添加scale = 1.0f / roundf(1.0f / scale);之后CGFloat scale = CGContextGetCTM(context).a;(它还可以防止瓷砖被绘制两次).

并绘制1像素更大的瓷砖...添加tileRect.size.width += 1; tileRect.size.height += 1;tileRect = CGRectIntersection(self.bounds, tileRect);.