以编程方式使用FLOAT高度/宽度的矩形填充UIView

时间:2013-05-31 11:27:07

标签: ios objective-c

我遇到的问题似乎很简单。 以编程方式使用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();

代码工作正常,但只有在明确拆分为素数相对于 宽度和高度。 E.G宽度= 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;

所以它在某处浮动vs int问题。但是在哪里?? !!

感谢您阅读本文。

1 个答案:

答案 0 :(得分:2)

有一些解决方案,没有一个是完美的,因为现实是屏幕对于某些尺寸不是完全可分的,所以如果你完美地制作它甚至你会在矩形的边界处有一些子像素“模糊”。

创意1:

您可以做的是使用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's line algorithm的一维版本,这是一个很好的相关阅读。

创意2:

计算合适的单元格大小并将其围绕向上,然后乘以单元格数以获得略大于屏幕的图像。然后使用整数像元大小绘制到该图像中并缩小图像以重新采样它。这意味着您将获得略微模糊的矩形边缘,但没有“洞”。