2017-08-11 8 views
0

CALayerのコンテンツとして画像を表示しようとしましたが、その境界をより大きなサイズに変更して少し拡大しました。 (これはあとでわかります) 何らかの理由で境界を設定しても、境界が変更されたりアニメーションがトリガーされたりすることはありません。CALayerの境界が一定の値に設定された後で変更されない

これは私が範囲を変更するために使用するコードです:

self.imageLayer.bounds = CGRect(x: 0, y: 0, width: 10, height: 10) 

私はCGRectを計算する機能を持っていますが、このダミー1は変わらない大きさのまったく同じ結果につながります。

私はサイズの変更が見えませんが、設定した直後にレイヤーの境界をチェックすると正しく設定されていることがわかりました。

次のコードは、境界を設定した後に実行されます。私はそれで何かを見つけることができなかった。

self.imageLayer.add(self.generatePanAnimation(), forKey: "pan") 

func generatePanAnimation() -> CAAnimation { 
    var positionA = CGPoint(x: (self.bounds.width/2), y: self.bounds.height/2) 
    var positionB = CGPoint(x: (self.bounds.width/2), y: self.bounds.height/2) 

    positionA = self.generateZoomedPosition() 
    positionB = self.generateZoomedPosition() 

    let panAnimation = CABasicAnimation(keyPath: "position") 
    if self.direction == .AtoB { 
     panAnimation.fromValue = positionA 
     panAnimation.toValue = positionB 
    } else { 
     panAnimation.fromValue = positionB 
     panAnimation.toValue = positionA 
    } 
    panAnimation.duration = self.panAndZoomDuration 

    self.panAnimation = panAnimation 
    return panAnimation 
} 

func generateZoomedPosition() -> CGPoint { 
    let maxRight = self.zoomedImageLayerBounds.width/2 
    let maxLeft = self.bounds.width - (self.zoomedImageLayerBounds.height/2) 
    let maxUp = self.zoomedImageLayerBounds.height/2 
    let maxDown = self.bounds.height - (self.zoomedImageLayerBounds.height/2) 

    let horizontalFactor = CGFloat(arc4random())/CGFloat(UINT32_MAX) 
    let verticalFactor = CGFloat(arc4random())/CGFloat(UINT32_MAX) 

    let randomX = maxLeft + horizontalFactor * (maxRight - maxLeft) 
    let randomY = maxDown + verticalFactor * (maxUp - maxDown) 

    return CGPoint(x: randomX, y: randomY) 
} 

私はさらに次のように境界を設定しようとしましたが、それは役に立ちませんでした。

CATransaction.begin() 
CATransaction.setValue(true, forKey: kCATransactionDisableActions) 
self.imageLayer.bounds = CGRect(x: 0, y: 0, width: 10, height: 10) 
CATransaction.commit() 

私は本当に誰かがアイデアを持っていることを願っています。どうもありがとう!

+0

これはいつですか? – matt

+0

また、「CALayerのコンテンツを少し拡大して、その境界をより大きなサイズに変更してイメージを表示しようとしています。」レイヤの境界を変更する方法は、これを行う方法ではありません。あなたが何をしようとしているのかをもっと詳しく説明してください。ありがとう。 – matt

+0

NSImage型の変数のdidSetメソッド内。私はそのコンテンツとして与えられたイメージを取得する新鮮なレイヤーを作成します。私は層の境界を拡大しない値に変更します(他の場合に必要です)。その後、古いレイヤーを置き換えることでレイヤーをサブレイヤーとして追加します。次に、上記のように範囲を変更します。 しかし、レイヤーが視覚的に示す境界は、最初に設定したものです。 –

答えて

1

レイヤの見た目のサイズを変更する方法は、boundsを変更するのではなく、transformを変更することです。図面を含めてレイヤーを大きく見せるには、スケール変換を適用します。

+0

ありがとうございました。それはそれを解決しました。 ほんの少しのフォローアップの質問。位置プロパティを変更すると、レイヤーを移動させる正しい方法ですか?そして、私はその限界をどのように使うのだろうか? –

+0

はい、そうです。代わりに 'frame'を変更することはできますが、変更することはできません。 :) – matt

+0

いいえ。私に起こった最後の1つ:レイヤーのサイズを変更するためにトランスフォームを使用すると、解像度に問題はありますか?私がズームインしたときにレイヤーのコンテンツをシャープにしたいのと同じように –

関連する問題