2016-12-27 2 views
2

그것의Swift3에서 KVO는 UIView의 알파입니까?

https://stackoverflow.com/a/25219216/294884

가 어떻게 UIView의의 알파를 KVO 않습니다 ... KVO이 위대한 게시물의 기술을 사용하여 Swift3의 값은 "쉽게"?

목표 : 작은 화면으로 화면을 상상하십시오. V. 화면에 큰 테이블보기가 있습니다. 각 셀에는 작은보기 CV가 있습니다.

나는 각 CV가

(내가 생각할 수있는 유일한 대안은 세포를 CADisplayLink 및 알파를 폴링하는 것입니다 V.의 알파의 애니메이션 중에 실제로 V의 1 알파를 따르십시오 가지 흡입 V,.)에 대한 그


1 이성? 이는 셀 전체에서 알파 변경 사항을 동기화하는 유일한 방법입니다. 레이어의 알파 애니메이션을하지 않는 사실 에 그냥 롭 같은 아래 설명


참고. (애니메이션의 시작 부분에서 "즉시"를 새로운 값으로 설정합니다.) 사실 프레젠테이션 레이어를 따라야합니다. 다음은 모든 과정을 원할 때부터 잡아 당기는 과정의 예입니다.

let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha)) 
d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes) 

func updateAlpha() { 
    let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat 
    follower.alpha = a 
    } 

답변

4

이것은 KVO의 이상적인 사례는 아닙니다. alpha을 변경하는 코드로 이동하여 다른보기에 필요한 업데이트를 수행하거나 (일반적으로 KVO 이외의 다른 인터페이스를 구현하는 인터페이스를 빌드하는 것이 좋습니다)

애니메이션을 다루는 경우 KVO가 alpha 일 경우에만 애니메이션 시작 중임을 알 수 있으며 애니메이션 중에 중반 변경 사항은 관찰하지 않습니다. (변경의 그 종류는 일반적으로 CADisplayLink 등의 presentation/presentationLayer으로 캡처됩니다.)

이 그래, 당신이 alpha 속성을 관찰 할 수 있다고 말했다 가졌어요. 그래서, 스위프트 3, 단지 상황에 맞는 정의 :

private var observerContext = 0 

을 그리고 관찰자 추가

observedView.addObserver(self, forKeyPath: "alpha", options: .new, context: &observerContext) 

을 다음 관찰자 구현 :

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    guard context == &observerContext else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
     return 
    } 

    // do what you want here 
} 

참고 관찰자를 제거해야합니다 . 예를 들어, deinit에서 그렇게 할 수 있습니다

deinit { 
    observedView.removeObserver(self, forKeyPath: "alpha", context: &observerContext) 
} 

참고, 스위프트 4,이 과정이 조금 단순화된다.

private var token: NSKeyValueObservation? 

을 그리고 다음 alpha 속성을 준수하십시오 : 당신의 관찰자를 추적하기 위해 token 속성을 정의

token = observedView.observe(\.alpha) { [weak self] object, change in 
    // do something 
} 

주 강한 참조주기가 발생하지 않습니다 폐쇄를 보장하기 [weak self]의 사용. 분명히 클로저에서 self을 참조하지 않을 경우에는 필요하지 않습니다.

그러나 블록 기반 패턴의 장점은 (a) token이 범위를 벗어나면 관찰자가 자동으로 제거되므로 특별한 deinit 루틴이 필요하지 않습니다. (b) observedView의 관찰 가능한 키가 이제는 키에 간단한 인쇄상의 오류를 피하면서 강하게 입력됩니다. (c) 관찰자가이 종결과 연결되어 있기 때문에 더 이상 관찰자의 컨텍스트를 점검 할 필요가없고 우리 문맥이 아닌 경우 self으로 전화하십시오.

+0

장엄한! 물론 forKeyPath : "alpha"입니다. 정말 고마워. – Fattie