2017-09-25 2 views
0

사용자가 이미지에서 2 가지 선택 항목을 선택할 수 있도록 구성 요소를 만들어야합니다. 처음에는 2 개의 이미지가 가운데에 "핸들"과 나란히 표시됩니다. 핸들을 왼쪽으로 움직이면 오른쪽 이미지가 더 많이 보이고 왼쪽 이미지는 적어지고 오른쪽 이미지가 보입니다. 그 반대의 경우도 마찬가지입니다.제스처에 대한 응답으로 UIImageview 마스크가 너무 느리게 업데이트됩니다.

기술적으로 2 개의 풀 사이즈가 있습니다. 팬 제스처가 있는데 사용자가 핸들을 슬라이드하면 핸들이 움직이고 마스크가 "새로운 중간"으로 조정되도록 업데이트됩니다.

이미지 마스크를 조정하는 코드는 다음과 같습니다. 상수는 제스처에 의해 호출되는 메서드에서 계산됩니다. 나는 "상수"와 마스크가 올바르게 업데이트되기 때문에 상수에 대한 계산이 잘된다는 것을 알고있다.

하지만

마스크는 너무 늦게 업데이트 및 드래그 할 때, 우리는 너무 늦게 조정되는 참조됩니다.

func adjustImagesMasks(to constant: CGFloat) { 
    choiceImageA.mask?.willChangeValue(forKey: "frame") 
    choiceImageB.mask?.willChangeValue(forKey: "frame") 

    let separationPoint: CGFloat = self.frame.width/2.0 + constant 

    maskA.backgroundColor = UIColor.black.cgColor 
    maskA.frame = CGRect(origin: .zero, size: CGSize(width: separationPoint, height: self.frame.size.height)) 

    maskB.backgroundColor = UIColor.black.cgColor 
    maskB.frame = CGRect(x: separationPoint, y: 0, width: self.frame.width - separationPoint, height: self.frame.size.height) 

    choiceImageA.mask?.didChangeValue(forKey: "frame") 
    choiceImageB.mask?.didChangeValue(forKey: "frame") 

    maskA.drawsAsynchronously = true 
    maskB.drawsAsynchronously = true 

    self.setNeedsDisplay() 
    maskA.setNeedsDisplay() 
    maskA.displayIfNeeded() 
    maskB.setNeedsDisplay() 
    maskB.displayIfNeeded() 
} 

이미지 뷰는 다음과 같이 자신의 마스크 설정이 있습니다

maskA = CALayer() 
maskB = CALayer() 
choiceImageA.layer.mask = maskA 
choiceImageA.layer.masksToBounds = true 
choiceImageB.layer.mask = maskB 
choiceImageB.layer.masksToBounds = true 

그래서 요약하자면, 내 질문은 성능에 대해 정말이다. 이미지보기가 올바르게 조정되었지만 너무 느립니다. 제약 조건이있는 "핸들"은 정말 빨리 업데이트됩니다.

답변

0

분명히 CALayer는 대부분의 변경 내용을 해당 속성에 적용하려고 시도합니다. 그래서 제가보고 있던 지연은 사실 애니메이션 때문이었습니다.

adjustImagesMasks()으로 전화를 걸어 CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)CATransaction.commit()으로 전화하여 문제가 해결되었습니다. 따라서 이번 거래에서는 변경 사항을 애니메이션화하지 않기를 바랍니다. 이것은 연속적이기 때문에 (팬 동작과 함께), 그것은 아무렇지도 않습니다. 여기

전체 코드 :

other post
CATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions) 
adjustImagesMasks(to: newConstant) 
CATransaction.commit()```. 

는 나에게 많은 도움이되었습니다. 너무 좋은 설명이 있습니다.

다른 사람에게 도움이되기를 바랍니다.

관련 문제