我有一个自定义的UIView,它可以在draw rect方法中绘制图像。我的问题是,当我分配对象时,UIView希望我使用initWithFrame。视图的边框需要与图像的大小和宽度相同。问题是,直到我创建视图的drawRect方法时,我才能获得图像的大小和宽度。在drawRect视图中,将no视图的边框更改为图像尺寸似乎没有任何效果。所以我想做的是这样的:
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];
发布于 2011-11-02 20:34:27
如果你看一下setFrame的文档,它会说:
此方法在设置框架矩形时,在其superview的坐标系内重新定位接收器并调整其大小。它既不重新显示接收器,也不将其标记为需要显示。您必须使用display或setNeedsDisplay:自己完成此操作。
它不会重新显示-通常是在设置了调用setNeedsDisplay的帧之后。但是,这突出了你的鸡和蛋的问题。setNeedsDisplay会导致drawrect触发。
此外,正如Sulthan指出的那样,做一些繁重的事情,比如在drawRect中加载图像,并不是一个好主意。它很重,像drawRect这样的东西在调整大小时会被重复调用。
我要么创建一个init模式(即使您说不是一个选项),要么创建一个属性来设置图像并在此时加载图像。
发布于 2011-11-02 20:28:27
从drawRect内部更改帧是...这不是个好主意。你认为系统如何在当前绘制的同时调整它的大小?
此外,从drawRect内部加载图像(运行缓慢)(可以经常调用)也不是一个很好的主意。您应该在获取文件名并更改图幅时加载图像。可能还会用到一些动画。用户不会期望视图在没有动画的情况下改变其大小。
和:
和no,在初始化我的自定义视图之前创建图像并将尺寸尺寸放入initWithFrame中是不可行的。
我不能想象任何情况下,这不是一个选择。这仅仅是关于你如何架构你的代码。
发布于 2011-11-02 20:52:11
在初始化我的自定义视图之前创建图像,并将尺寸尺寸放入initWithFrame中,这不是一个选项。
我不明白为什么这不是一个选择,但好吧。您的视图中有一个属性,self.imgName
。当这个设置完成时(必须在图像绘制之前),你应该得到图像,计算出它的大小,并在那个点设置你的框架。
https://stackoverflow.com/questions/7980144
复制相似问题