setNeedsDisplayInRect:方法在iOS11及以后系统上的差异。

当我们需要实现一些特殊需求时,需要对UIView的drawRect:方法重写。但是苹果官方文档明确表示drawRect:方法不能由我们直接调用,只能由系统直接调用。除了viewdidload,sizeToFit,或者改变view的frame会触发drawRect以外,我们还可以通过调用setNeedsDisplayInRect:和setNeedsDisplay方法触发系统调用drawRect。
系统调用drawRect的逻辑是在view发生变化的时候调用。而setNeedsDisplayInRect:和setNeedsDisplay方法就是告诉系统view发生了变化,需要重新绘制。setNeedsDisplayInRect:(CGRect)rect,是告诉系统rect这个 区域发生了变化。这样在drawRect:(CGRect)rect方法中可以只对rect区域进行重新绘制。
近期项目中发现一个bug:在iOS11上调用setNeedsDisplayInRect:方法会偶现没有触发drawRect的情况。后来进一步发现调用setNeedsDisplayInRect:(CGRect)rect的时候,如果view的frame不包含rect的时候,就不会触发drawRect方法,但是iOS11以后的系统却可以调用。目前还不知道为什么会产生这个差异。
所以修改方法就是

            if (@available(iOS 12.0, *) || CGRectContainsRect(self.frame, rect)) {///fix bug:ios11及以下系统,如果self.frame不包含rect调用[self setNeedsDisplayInRect:rect]不会调用drawrect
                [self setNeedsDisplayInRect:rect];
            }else{
                [self setNeedsDisplay];
            }

你可能感兴趣的:(setNeedsDisplayInRect:方法在iOS11及以后系统上的差异。)