讨论
飞鱼 2018-02-24 11:16
模拟器测试时,刷新会有延迟,真机测试没问题。是哪里设置不正确吗?
问题描述:
问题描述:
setNeedsDisplay()
func draw(_ rect: CGRect)
方法都执行了,模拟器没有刷新。等下一次执行时才更新上一次的画面。Swift 2018-02-24 15:29
@飞鱼 网上找了下资料,你看看
drawRect在以下情况下会被调用:
2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
drawRect方法使用注意点:
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个 invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext:中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
2、若使用calayer绘图,只能在drawInContext:
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
飞鱼 2018-02-24 16:02
@Swift
谢谢!我在真机上测试是正常的,点击和轻扫手势都能正常响应。在模拟器上总是慢一步。
和视频中讲的一样。设置 contentMode属性值为UIViewContentModeRedraw。
当改变属性时调用 setNeedsDisplay()触发drawRect:。
drawRect正常执行。这个方法执行完屏幕应该会刷新的吧。但是模拟器并没有刷新。而是等到下一次执行这个方法的时候才把上一次的绘制到屏幕上。这应该是模拟器的问题吧。
谢谢!我在真机上测试是正常的,点击和轻扫手势都能正常响应。在模拟器上总是慢一步。
和视频中讲的一样。设置 contentMode属性值为UIViewContentModeRedraw。
当改变属性时调用 setNeedsDisplay()触发drawRect:。
drawRect正常执行。这个方法执行完屏幕应该会刷新的吧。但是模拟器并没有刷新。而是等到下一次执行这个方法的时候才把上一次的绘制到屏幕上。这应该是模拟器的问题吧。
Swift 2018-02-24 16:13
@飞鱼 那有可能吧,是不是模拟器资源不足。
飞鱼 2018-02-24 16:28
@Swift 我的模拟器旋转都对不齐的,要点一下后才会对齐。边缘有锯齿。
Swift 2018-02-24 16:43
@飞鱼 好吧,这个证据应该足以说明代码没问题。