2017-09-25 8 views
0

ユーザーが画像の2つの選択肢から選択できるようにするコンポーネントを作成する必要があります。最初は、2つの画像が中央に「ハンドル」が並んで表示されています。ハンドルを左に動かすと、右画像と右画像の両方が表示されます。UIImageviewのマスクがジェスチャーに応答して更新が遅すぎる

技術的には、私はフルサイズの2つのフルサイズを持っており、それらはマスクされています。私はパンのジェスチャーを持っており、ユーザーがハンドルをスライドさせると、ハンドルが動いて、マスクが "新しい中間"に合わせて自分自身を更新します。

画像マスクを調整するコードは次のとおりです。定数は、ジェスチャーによって呼び出されるメソッドで計算されます。私は "ハンドル"とマスクが正しく更新されるので、定数の計算が良いことが分かります。

しかし

マスクは手遅れに更新してドラッグするとき、我々はそれが手遅れに調整されて表示されます。おさらいに、私の質問は、パフォーマンスについて実際にあるので

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

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() 
} 

画像ビューはこのように自分のマスクを設定しています。イメージビューは正しく調整されていますが、ゆっくりと表示されます。制約のある「ハンドル」は、すばやく更新されます。

答えて

0

明らかに、CALayerはほとんどの変更をプロパティに反映させようとします。だから、私が見ていた遅れは、実際にはアニメーションによるものでした。

adjustImagesMasks()の電話番号をCATransaction.setValue(kCFBooleanTrue, forKey:kCATransactionDisableActions)CATransaction.commit()に変更して問題を解決しました。このトランザクションでは、変更をアニメーション化しないようにしています。これは連続的なので(パンニングジェスチャーで)、それは見た目ではありません。ここ

全コード:

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

このother postは私をたくさん助けました。あまりにも良い説明があります。

これは他の人に役立つことを願っています。

関連する問題