1

我遇到了一些看似简单的问题。使用下面的代码以编程方式用 FLOAT 高度/宽度的矩形填充 UIView,矩形之间没有任何空格(矩形应该连接)。

    int  WIDTH = 72(does NOT work);//80(works);//32(works);
    int  HEIGHT = 45(does NOT work);//50(works);//20(works);
    _cellSizeX = self.bounds.size.width / WIDTH;
    _cellSizeY = self.bounds.size.height / HEIGHT;
    UIGraphicsBeginImageContext(self.bounds.size);
    CGRect cellFrame = CGRectMake(0, 0,_cellSizeX, _cellSizeY);
    _cellIndex = 0;

    for (int i = 0; i < WIDTH; i++)
    {
        cellFrame.origin.y = 0;
        for (int j = 0; j < HEIGHT; j++, _cellIndex++)
        {  
            [_Image drawInRect:cellFrame blendMode:kCGBlendModeOverlay alpha:1.0];
            cellFrame.origin.y += _cellSizeY;
        }
        cellFrame.origin.x += _cellSizeX;
    }
    _blendedImage = UIGraphicsGetImageFromCurrentImageContext();
    _Layer.contents = (id) _blendedImage.CGImage;
    UIGraphicsEndImageContext();

该代码工作正常,但前提是相对于宽度和高度明确划分为素数。EG 宽度 = 480,高度 = 300。

The Primes of 480 are: 480= 2*2*2*2*2*3*5;
The Primes of 300 are: 300= 2*2*3*5*5;
And their common primes are: 2*2*3*5;

这意味着我对行/列中的大量单元格很好:

8(actually 2*2*2)/5;
16 / 10;
24 / 15;
32 / 20;
...;
80 / 50;

但不是例如 72 / 45.... 说得简单的原因:

480 / 72 = 6,6666667;
300 / 45 = 6,6666667;

另一方面,可行的示例:

480 / 32 = 15;
300 / 20 = 15;

所以它在某个地方是一个浮点数与整数的问题。但是哪里 ??!!

谢谢您阅读此篇。

4

1 回答 1

2

有一些解决方案,没有一个是完美的,因为现实情况是,对于某些尺寸,屏幕并不是完全可分的,所以如果你做到完美,即使你会在矩形的边界处有一些亚像素“模糊”。

想法1:

您可以做的是使用 a 保持运行总计float,但将每个矩形边界钳制到int. 这意味着计算矩形的底部和右侧边缘将在哪里结束,float然后使用钳位int值,从之前的底部和右侧边缘计算宽度和高度。在这种情况下,您将得到不均匀的矩形大小,但只有 1 个单位的差异。例如 320 分为 6 列将是:

+-----+-------+---------------+
| idx | width | running-total |
+-----+-------+---------------+
|  0  | 53    | 53.3333333333 |
|  1  | 53    | 106.666666666 |
|  2  | 54    | 160.0         |
|  3  | 53    | 213.333333333 |
|  4  | 53    | 266.666666666 |
|  5  | 54    | 320.0         |
+-----+-------+---------------+

这同样适用于y方向。为了进一步减少视网膜显示器上的误差,您可以将值加倍(乘以scale),然后在计算后将其减半(除以scale),这样您只会得到 1 像素(0.5 单位)的差异。

这种方法在概念上类似于Bresenham 线算法的一维版本,这是一个很好的相关阅读。

想法2:

计算一个合适的 cell-size 并四舍五入然后乘以 cell 的数量,得到一个比屏幕略大的图像。然后使用整数单元格大小绘制到该图像中并缩小图像重新采样。这意味着您将得到矩形的略微模糊的边缘,但没有“洞”。

于 2013-05-31T12:43:41.310 回答