CALayer 边界在将它们设置为某个值后不会改变
CALayer bounds don't change after setting them to a certain value
我正在尝试将图像显示为 CALayer 的内容,方法是通过将其边界更改为更大的尺寸来稍微放大 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()
我真的希望有人有想法。非常感谢!
改变层的外观绘图大小的方法不是改变它的bounds
而是改变它的transform
。要使图层(包括其绘图)看起来更大,请应用缩放变换。
我正在尝试将图像显示为 CALayer 的内容,方法是通过将其边界更改为更大的尺寸来稍微放大 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()
我真的希望有人有想法。非常感谢!
改变层的外观绘图大小的方法不是改变它的bounds
而是改变它的transform
。要使图层(包括其绘图)看起来更大,请应用缩放变换。