没有为UIImageView调用drawRect
我的IB中有一个UIImageView,我用一个方法drawRect创建了一个UIImageView的子类:
@implementation UIImageViewLine - (void)drawRect:(CGRect)rect { NSLog(@"CALLED"); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); CGContextSetLineWidth(context, 1.0f); CGContextMoveToPoint(context, 0, 0); CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height); CGContextStrokePath(context); } @end
我已经将UIImageView的类更改为此子类,但是从不调用drawRect。 知道为什么吗?
子类时, UIImageView
不调用drawRect
。
从文档 :
UIImageView类经过优化,可将其图像绘制到显示器上。 UIImageView不会调用drawRect:一个子类。 如果您的子类需要自定义绘图代码,建议您使用UIView作为基类。
你可以简单地用普通的UIView
替换UIImageView
,并在UIView
的drawRect
方法或子层中绘制图像和自定义绘图。
除了sch的答案之外,值得注意的是UIImageView如何以不同的方式用于UIView。
使用ImageView的方法是更改其.image属性。 这意味着图像缓存在视图堆栈上。 如果图像每帧都改变,那么这不会给你太多。 但如果没有,那就是一个相当大的改进。 在大多数游戏/应用程序中,大多数对象不会每帧都改变。
您可以通过调用底层CALayer来更改UIView的位置,旋转和不透明度。 这只是对转换矩阵的改变,因此几乎没有时间损失。
我强烈建议任何不熟悉这个参数的制作实时2D图形的人都会阅读https://developer.apple.com/library/ios/qa/qa1708/_index.html ,这样可以更好地解释这个论点并提供示例代码。 这样做非常简单。
将您的游戏对象包装在UIImageView中的想法似乎违反直觉,因为您不会将游戏逻辑与表示级别分开,这会将它们绑定在一起。 然而,根据Apple的建议刚刚修改了我的游戏原型,我的帧率提高了一倍,所以我非常愿意牺牲我的建筑纯度。
- 什么是iOS 4.1中的类NSCFNumber?
- openURL本地文件或强制UIDocumentInteractionController使用特定的应用程序
- 显示ios键盘上方的build议工具栏
- 我可以在UILabel中使用Tally标记字体吗?
- Apple TV上的AirPlay元数据(AVPlayer – MPVolumeView)
- AVAssetWriterInputPixelBufferAdaptor appendPixelBuffer
- NSURLConnection sendAsynchronousRequest – 与HTTPS通信
- Google Analytics(分析)for iOS – 使用词典发送自定义事件数据,因为createEventWithCategory只允许发送4个参数
- XCode5模拟器:未知选项字符“X”在:-Xlinker