2017-09-04 63 views
1

我使用self.bound来获取drawRect方法中的UIView大小。但是现在,随着XCode的9,我得到这样的警告:如何在drawRect中获取UIView大小

主线程检查器:UI API称为后台线程: - [UIView的 界]

什么是获得正确的方式在drawRect方法中查看大小?

+0

试着派发主线程。 – Lumialxk

+0

我会试图找出它为什么被称为后台线程,感谢提示... –

回答

4

像这样:

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

但事实上,drawRect被要求摆在首位后台线程是一个不好的征兆 - 除非你使用CATiledLayer或其他一些内置的架构,做这个。您首先应该担心的是

+0

我在这个视图中使用CATiledLayer,所以这是正常的drawRect在后台调用。 –

+1

好,如果你看看我的评论和我的回答,那正是我要求你确认的内容!在那种情况下,是的,这是解决问题的方法。事实证明,我们一直在做这件事,只有现在,主线检查器才会出现并将我们击倒。它已经证明它的价值! – matt

+0

您认为在drawRect中执行同步操作会减慢绘图速度吗?你认为如何重写layoutSubviews并将其大小保存为类成员? –

4

我终于找到了解决问题的办法。我现在首要的UIView layoutSubviews保持视图边界的类成员:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    m_SelfBounds = self.bounds; 
} 

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