我有一个自定义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];
答案 0 :(得分:5)
如果您查看setFrame的文档,则会说:
此方法在设置框架矩形时,重新定位和调整大小 超视图坐标系内的接收器。它既不是 重新显示接收器并将其标记为需要显示。你必须这样做 这是你自己的display或setNeedsDisplay:。
它不会重新显示 - 通常在设置您调用setNeedsDisplay的帧之后。但是,这突出了你的鸡和鸡蛋问题。 setNeedsDisplay导致drawrect to fire。
另外,正如Sulthan指出的那样,做一些像在drawRect中加载图像一样重的东西并不是一个好主意。它的重量很重,像drawRect这样的东西会在调整大小等时反复调用......
我会创建一个初始化模式(即使你说不是一个选项),或者创建一个属性来设置图像并在那时加载图像。
答案 1 :(得分:3)
从drawRect内部更改框架是......不是一个好主意。 您如何想象系统在当前正在绘制它时调整大小?
同样从drawRect内部加载图像(慢速操作)(可以经常调用)不是一个好主意。 您应该在获取文件名时加载图像并在此时更改视图框。并且可能使用了一些动画。如果没有动画,用户不会期望视图改变其大小。
和
不,在我初始化自定义视图并将大小尺寸放入initWithFrame之前创建图像不是一种选择。
当这不是一个选项时,我无法想象任何情况。这只是关于如何构建代码的。
答案 2 :(得分:0)
否,在我初始化自定义视图并将大小尺寸放入initWithFrame之前创建图像不是一种选择。
我不明白为什么那不是一个选择,但是好的。您的视图中有一个属性self.imgName
。设置此项时( 在绘制图像之前),您应该获取图像,计算其大小并在此时设置框架。