2017-12-11 9 views
1

나는 많은, 많은, 많은 분 동안 시도 후 CALayerconvertToDeviceSpace를 만드는 방법은 하나씩 곱하기 이외의 다른 작업을 수행 하시겠습니까?

override open func draw(in ctx: CGContext) { 

    let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size 

    print("bounds \(bounds)") 
    print("rectDEVICESPACE \(rectDEVICESPACE)") 

이 같은 코드를 실행하면 우리는 그것이 불가능 어떠한 변환이나 규모 찾을 발견했다.

convertToDeviceSpace 항상 똑같은 것을 반환합니다. 장치, 시뮬레이터의

enter image description here

시도 산, 등 등

특정 실제 상황 convertToDeviceSpace 신원 이외의 아무것도 할 것이다은 무엇입니까

?

Apple 문서 및 모든 기존 코드 샘플은 블리 팅 할 때 원시 픽셀 크기를 계산할 때처럼 정확하게 사용하기 때문에 매우 위험합니다. 오류는 엄청난 결함이 될 수 있습니다.

구체적인 실제 상황은 무엇입니까 여기서 convertToDeviceSpace은 1.0 이외의 값을 사용합니까?

내가 뭘 잘못했는지, 특히 테스트에서 나는 정체성 이외의 결과를 전혀 볼 수 없다는 것을 알고 있습니까?

답변

1

나는 어떤 Google 직원을 돕기 위해, 내 자신의 질문을 답변 해 드리겠습니다 : 사실

convertToDeviceSpace는 contentsScale는 픽셀 밀도를 제공한다고 가정합니다!

하고 실제로 그

당신 의미 실제로 이미이 contentsScale 직접 설정해야 할 필요가!

!

Apple 화면 밀도가 아닌 contentsScale이 기본값 인 1로 유지됩니다.

기본적으로 convertToDeviceSpace는 UIView 크기, 시간, contentsScale을 반환합니다.

는 {. 또한, 애플은 "실제, 물리적 인"픽셀 크기를 점점로 만들 것입니다 미래의 알 수없는 계산}

이 조금 알려진 사실로 보인다 :

iOS의 경우에

사용자 정의 레이어를 만들고 픽셀 단위로 부드럽게 그리는 것으로 가정하면 실제로는 콘텐츠를 설정해야합니다. 그러면 초기화 시간에을 지정해야합니다. (TBC, 한번 그리는 것은 이미 문맥에서 불려지는 심각한 실수 일 것입니다.https://stackoverflow.com/a/47760444/294884

:)

class PixelwiseLayer: CALayer { 

    override init() { 

     super.init() 
     // SET THE CONTENT SCALE AT INITIALIZATION TIME 
     contentsScale = UIScreen.main.scale 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

다음은 문제의 광대 한 시험이다