Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式使用浮动高度/宽度的矩形填充UIView_Ios_Objective C - Fatal编程技术网

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

Ios 以编程方式使用浮动高度/宽度的矩形填充UIView,ios,objective-c,Ios,Objective C,我在一些看似简单的事情上遇到了问题。 以编程方式使用浮动高度/宽度的矩形填充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; _cell

我在一些看似简单的事情上遇到了问题。 以编程方式使用浮动高度/宽度的矩形填充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();
这意味着我可以处理行/列中的大量单元格:

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;
所以这是一个浮点与整数的问题。但是在哪里


感谢您阅读。

有一些解决方案,没有一个是完美的,因为现实情况是,屏幕对于某些尺寸而言并不完全可分割,因此,如果您将其制作得完美,您将在矩形的边界处出现一些亚像素的“模糊”

想法1:

您可以使用
浮点
,但将每个矩形边界钳制为
int
。这意味着计算矩形的底边和右边将以
float
结束的位置,然后使用钳制的
int
值,计算前一个底边和右边的宽度和高度。在这种情况下,您将得到不均匀的矩形大小,但只有1个单位的差异。例如,分为6列的320将是:

+-----+-------+---------------+
| 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方向。为了进一步减少视网膜显示的误差,您可以将数值加倍(乘以
比例
),然后在计算后将数值减半(除以
比例
),这样您只能得到1像素(0.5个单位)的差值

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

想法2:


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

我没有提到要填充整个屏幕。因此,将6.66667四舍五入到6或6.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         |
+-----+-------+---------------+