如何在drawRect中获取UIView大小

Dav*_*non 2 iphone objective-c uikit ios ios11

self.bound用来获取drawRect方法中的UIView大小.但是现在,使用XCode 9,我收到了这个警告:

主线程检查器:在后台线程上调用UI API: - [UIView bounds]

在方法中获取视图大小的正确方法是什么drawRect

mat*_*att 6

像这样:

override func drawRect(rect: CGRect)
    let bds = DispatchQueue.main.sync {
        return self.bounds
    }
    // ....
}
Run Code Online (Sandbox Code Playgroud)

但是,drawRect首先在后台线程上调用的事实是一个不好的迹象 - 除非您使用CATiledLayer或其他内置架构来执行此操作.你应该首先担心这一点.

  • 好的,如果你看看我的评论和答案,那正是我要求你确认的!在这种情况下,是的,这是摆脱问题的方法.事实证明我们一直都是这样做的; 只是现在有主线程检查器出现并打了我们.它证明了它的价值! (3认同)
  • 很酷,但一定要在Thread Sanitizer下运行,以确保你没有引入竞争条件. (2认同)

Dav*_*non 5

我终于找到了问题的解决方案.我现在重写layoutSubviewsUIView以保持类成员中的视图边界:

- (void)layoutSubviews
{
    [super layoutSubviews];
    m_SelfBounds = self.bounds;
}
Run Code Online (Sandbox Code Playgroud)

在那之后,我只是m_SelfBounds在使用drawRect方法.

  • 这还没有解决您的线程安全错误-您所做的只是以编译器不够智能的方式来警告您,从而创建了相同的错误。m_SelfBounds值可以在drawRect操作的一半进行更改。 (2认同)