2011-11-02 69 views
2

我有抽奖RECT方法绘制图像的自定义的UIView。我的问题是当我分配对象时,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]; 

回答

5

如果你看一下文档的SETFRAME它说:

这种方法,在设定的框架矩形,重新定位并调整 它的父坐标系内的接收器。它既不会 重新显示接收器,也不会将其标记为需要显示。您必须使用display或setNeedsDisplay:来自己做 。

它不会重新显示 - 通常在设置调用setNeedsDisplay的框架后。但是,这突出了你的鸡和鸡蛋问题。 setNeedsDisplay会导致drawrect被触发。另外,正如Sulthan所指出的那样,执行一些像在drawRect中加载图像一样重的东西并不是一个好主意。这是沉重的重量和drawRect之类的东西被重复调用大小等...

我会创建一个init模式(即使你说没有选项),或创建一个属性来设置图像,并有图像加载那时候。

+0

你说得对。通常我在将视图插入到另一个视图或使用动画之前更改了框架,并且在这两种情况下都会自动重新绘制视图,所以我忘记了我必须调用setNeedsDisplay。 – Sulthan

3

改变从内部的drawRect框架是...不是一个很好的主意。 您认为系统在绘制它时会如何调整大小?

而且从装载里面的drawRect图像(慢速运行)(经常被调用)是不是一个很好的主意。 当您获取文件名并在此时更改视图框架时,您应该加载图像。并可能使用一些动画。如果没有动画,用户不会期望视图改变大小。

和:

没有,创建映像前,我初始化我的自定义视图,并把大小尺寸为initWithFrame是不是一种选择。

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

+0

从我所有的阅读中,使用drawRect在UIView中创建图像比使用UIImageViews更快,更轻 - 是不是这种情况?如果是的话,我可以在哪里阅读?或者你有其他建议吗?我可能在任何时候在屏幕上显示超过50张图片。另外我的图像很可能会被用户缩放,旋转和翻转。 http://stackoverflow.com/questions/7915320/ios-many-images-maintaining-good-performance – spentak

+1

什么是快速绘制drawRect中的图像。不太快的是图像数据的实际加载和解码。你应该只做一次。您应该在之前的某个位置创建UIImage,然后将其翻转,缩放或以其他方式进行转换。不要一遍又一遍地创建它。 UIImageView可能以完全相同的方式实现,所以你的实现不是轻量级的。 – Sulthan

0

不,在我启动我的自定义视图并将大小尺寸放入initWithFrame之前创建图像不是一个选项。

我不明白为什么这不是一个选项,但确定。你有一个财产在你的看法,self.imgName。设置此项时(其中在绘制图像之前),您应该获取图像,计算其大小并在此点设置框架。