美文网首页
setNeedsDisplayInRect:方法在iOS11及以

setNeedsDisplayInRect:方法在iOS11及以

作者: jlstmac | 来源:发表于2020-11-03 10:35 被阅读0次

    当我们需要实现一些特殊需求时,需要对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及以

          本文链接:https://www.haomeiwen.com/subject/qplbvktx.html