将CALayer设置为某个值后,CALayer界限不会发生变化

时间:2017-08-11 17:48:40

标签: swift macos calayer appkit bounds

我正在尝试显示图像,因为CALayer的内容通过将其边界更改为更大的尺寸而略微放大。 (这样我以后可以把它翻过来。) 出于某种原因,设置边界不会改变它们或触发动画来执行此操作。

这是我用来改变界限的代码:

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

我有一个计算CGRect的函数,但是这个虚函数会导致大小不相同的结果。

我还确定,虽然我无法看到尺寸变化,但如果我在设置后立即检查图层的边界,则它正确地具有我设置的值。

设置边界后执行以下代码。我无法找到任何内容,这会改变它们。

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

我真的希望有人有个主意。非常感谢!

1 个答案:

答案 0 :(得分:1)

更改图层的表观图纸尺寸的方法不是更改其bounds,而是更改其transform。要使图层看起来更大,包括其绘图,请应用缩放变换。