讨论
飞鱼 头像
苹果0袋
0
飞鱼   2018-02-24 11:16
模拟器测试时,刷新会有延迟,真机测试没问题。是哪里设置不正确吗?
问题描述:

setNeedsDisplay()

func draw(_ rect: CGRect)

方法都执行了,模拟器没有刷新。等下一次执行时才更新上一次的画面。
Swift 头像
苹果5袋
5
Swift   2018-02-24 15:29
@飞鱼 网上找了下资料,你看看
drawRect在以下情况下会被调用:

 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
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实时刷新屏幕
飞鱼 头像
苹果0袋
0
飞鱼   2018-02-24 16:02
@Swift
谢谢!我在真机上测试是正常的,点击和轻扫手势都能正常响应。在模拟器上总是慢一步。
和视频中讲的一样。设置 contentMode属性值为UIViewContentModeRedraw。
当改变属性时调用 setNeedsDisplay()触发drawRect:。
drawRect正常执行。这个方法执行完屏幕应该会刷新的吧。但是模拟器并没有刷新。而是等到下一次执行这个方法的时候才把上一次的绘制到屏幕上。这应该是模拟器的问题吧。
Swift 头像
苹果5袋
5
Swift   2018-02-24 16:13
@飞鱼 那有可能吧,是不是模拟器资源不足。
飞鱼 头像
苹果0袋
0
飞鱼   2018-02-24 16:28
@Swift 我的模拟器旋转都对不齐的,要点一下后才会对齐。边缘有锯齿。 Gestures and Multiple MVCs
Swift 头像
苹果5袋
5
Swift   2018-02-24 16:43
@飞鱼 好吧,这个证据应该足以说明代码没问题。
您还未登录,请先登录