首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >自定义UI视图更改框架大小

自定义UI视图更改框架大小
EN

Stack Overflow用户
提问于 2011-11-02 20:16:05
回答 3查看 10.2K关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame: CGrectMake(0,0,0,0)];

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-02 20:34:27

如果你看一下setFrame的文档,它会说:

此方法在设置框架矩形时,在其superview的坐标系内重新定位接收器并调整其大小。它既不重新显示接收器,也不将其标记为需要显示。您必须使用display或setNeedsDisplay:自己完成此操作。

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

此外,正如Sulthan指出的那样,做一些繁重的事情,比如在drawRect中加载图像,并不是一个好主意。它很重,像drawRect这样的东西在调整大小时会被重复调用。

我要么创建一个init模式(即使您说不是一个选项),要么创建一个属性来设置图像并在此时加载图像。

票数 5
EN

Stack Overflow用户

发布于 2011-11-02 20:28:27

从drawRect内部更改帧是...这不是个好主意。你认为系统如何在当前绘制的同时调整它的大小?

此外,从drawRect内部加载图像(运行缓慢)(可以经常调用)也不是一个很好的主意。您应该在获取文件名并更改图幅时加载图像。可能还会用到一些动画。用户不会期望视图在没有动画的情况下改变其大小。

和:

和no,在初始化我的自定义视图之前创建图像并将尺寸尺寸放入initWithFrame中是不可行的。

我不能想象任何情况下,这不是一个选择。这仅仅是关于你如何架构你的代码。

票数 3
EN

Stack Overflow用户

发布于 2011-11-02 20:52:11

在初始化我的自定义视图之前创建图像,并将尺寸尺寸放入initWithFrame中,这不是一个选项。

我不明白为什么这不是一个选择,但好吧。您的视图中有一个属性,self.imgName。当这个设置完成时(必须在图像绘制之前),你应该得到图像,计算出它的大小,并在那个点设置你的框架。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7980144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档