自定义 UI 视图更改帧大小

Posted

技术标签:

【中文标题】自定义 UI 视图更改帧大小【英文标题】:Custom UI View Change frame size 【发布时间】:2011-11-02 12:16:04 【问题描述】:

我有一个自定义 UIView,它在 draw rect 方法中绘制图像。我的问题是 UIView 希望我在分配对象时使用 initWithFrame。视图的框架需要与图像的大小和宽度相同。问题是直到我正在创建的视图的 drawRect 方法才能获得该图像的大小和宽度。在 drawRect 视图中,将 UIView 的框架更改为图像尺寸似乎没有效果。所以我想做的是这样的:

MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame: CGrectMake(0,0,0,0)];

然后在 MyCustomView 的 drawRect 方法中,我想以某种方式将视图的框架更改为我正在创建的图像的框架大小。

如何获得我想要的结果?不,在我初始化自定义视图之前创建图像并将尺寸尺寸放入 initWithFrame 不是一种选择。

这是我当前在视图的 drawRect 方法中的代码

UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",self.imgName]];
CGSize imgSize = [image size];
CGRect newrect = CGRectMake(self.frame.origin.x, self.frame.origin.y, imgSize.width, imgSize.height);
self.frame = newrect; //This does nothing!!
CGRect imgRect = CGRectMake(0, 0, imgSize.width, imgSize.height);
[image drawInRect:imgRect];

【问题讨论】:

【参考方案1】:

如果您查看 setFrame 的文档,它会说:

此方法,在设置框架矩形时,重新定位和调整大小 接收者在其superview的坐标系中。它既不 重新显示接收器,也不将其标记为需要显示。你必须做 这个自己用 display 或 setNeedsDisplay:.

它不会重新显示 - 通常在设置您调用 setNeedsDisplay 的框架之后。但是,这突出了你的鸡和蛋的问题。 setNeedsDisplay 导致 drawrect 触发。

此外,正如 Sulthan 所指出的,在 drawRect 中加载图像等繁重的工作并不是一个好主意。它很重,像 drawRect 这样的东西在调整大小等时会被反复调用......

我会创建一个初始化模式(即使你说不是一个选项),或者创建一个属性来设置图像并在那时加载图像。

【讨论】:

你是对的。通常我会在将视图插入另一个视图或使用动画之前更改帧,在这两种情况下,视图都会自动重绘,所以我忘记了我必须调用 setNeedsDisplay。【参考方案2】:

从 drawRect 内部更改框架...不是一个好主意。 您如何想象系统在绘制某物时会调整其大小?

另外从drawRect(可以经常调用)内部加载图像(慢操作)不是一个很好的主意。 您应该在获取文件名并更改视图框架时加载图像。并且可能使用一些动画。用户不会期望视图在没有动画的情况下改变其大小。

还有:

不,在我初始化自定义视图之前创建图像并将大小尺寸放入 initWithFrame 不是一种选择。

如果这不是一个选项,我无法想象任何情况。这只是关于你如何构建你的代码。

【讨论】:

从我的所有阅读中,使用 drawRect 在 UIView 中创建图像比使用 UIImageViews 更快更轻 - 不是这样吗?如果是这样,我可以在哪里阅读?或者你有别的建议吗?在任何给定时间,我都有可能在屏幕上显示 50 多张图像。此外,我的图像很可能会被用户缩放、旋转和翻转。 ***.com/questions/7915320/… 快速的就是在drawRect中画图。不快的是图像数据的实际加载和解码。你应该只做一次。您应该在之前的某个地方创建 UIImage,然后将其翻转、缩放或以其他方式进行转换。不要一遍又一遍地创建它。 UIImageView 的实现方式可能完全一样,所以你的实现不是轻量级的。【参考方案3】:

不,在我初始化我的自定义视图之前创建图像并将大小尺寸放入 initWithFrame 不是一种选择。

我不明白为什么这不是一个选项,但可以。您的视野中有一处房产,self.imgName。设置好后(必须在图像绘制之前设置),您应该获取图像,计算出它的大小并在该点设置您的框架。

【讨论】:

以上是关于自定义 UI 视图更改帧大小的主要内容,如果未能解决你的问题,请参考以下文章

自定义 ViewGroup 中的视图在大小更改后未呈现

iOS 8 自定义视图控制器演示:在动画期间更改呈现的 VC 的大小

自定义 UI 滑块,拇指图像大小问题

居中自定义大小的 UIModalPresentationPageSheet?

如何调整自定义tableview单元格下的UIImageview

自定义 UITableViewCell 中的 UIImageView 在单击时调整大小