1

所以我有一个 uiview,它使用一个框架初始化,该框架具有为用户提供的高度和宽度,我希望用户能够在此框架内绘制,但是当用户按下按钮时,我希望视图剪切消除多余的浪费空间,使框架仅与用户绘制的一样大。我试图做这样的事情

CGRect boundbox = CGPathGetBoundingBox([myPath CGPath]);
boundbox.origin.x = self.frame.origin.x;
boundbox.origin.y = self.frame.origin.y;
self.frame = boundbox;

然而,这并没有消除额外浪费的空间,它只是调整视图的大小,使绘制的内容看起来比以前更小。我想做的是删除那个“空白”,我在想是否可以扩大uiview的内容,但我不确定。

为了澄清我的意思:

在此处输入图像描述

红色边框是用户可以绘制的区域/框架,中间的文本是一幅图画,当用户按下按钮时,我希望框架只包围图画,如图 2 所示。

在此处输入图像描述

现在假设我有以下场景,我在屏幕中间画了一个圆圈。

在此处输入图像描述

然后当我按下按钮时,比例保持不变,但圆圈仍然在相同的位置,但我们现在已经更改了绘图区域,所以圆圈/绘图看起来像图 4 中的截断。

在此处输入图像描述

我想要做的是移动绘图/贝塞尔路径,使其位于框架的中间。使红色区域包围蓝色圆圈。

4

1 回答 1

1

[编辑] 鉴于您的图纸。当您更改它的 frame 属性(或它的 CGRect)时,UIView 不会重新定位其中的项目。在这种情况下,您需要跟踪自己绘制的项目,然后在按下按钮时自己执行对象翻译。

这意味着您必须找到最左边的对象,最上面的对象,然后将所有对象向左移动该数量,然后向上移动该数量,以便所有对象(作为一个分组)左上对齐在视图的框架内。在此之后,您将需要自我识别哪个对象最右边以及哪个对象最底部触摸。

现在,由于您已经将项目左上角移动,最右边的点将定义您的框架宽度,最底部的点将定义您的框架高度。

如果您愿意,您应该可以在完成此操作后使用下面的属性进行放大。

[第一个答案] 如果我正确理解您的问题,您可能仍希望执行框框操作,但如果您希望缩放,您可能需要查看

contentScaleFactor or
contentStretch

特性。

contentScaleFactor 应该基于单个浮点值(即 xWidth * scaleFactor、yHeight * 比例因子)缩放两个维度。

contentStretch 是一个 CGRect ,这意味着它应该分别缩放每个维度(轴)。

于 2012-06-03T18:42:35.423 回答