2017-09-04 8 views
1

메서드에서 UIView 크기를 얻으려면 self.bound을 사용하고 있습니다.drawRect에서 UIView 크기를 얻는 방법

홈페이지 스레드 검사기 : 배경 스레드에서 호출 UI의 API :하지만 지금, 엑스 코드 (9)와,이 경고를 얻을 - [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을 사용하고 있습니다.