2017-08-11 66 views
0

我試圖通過將CALayer的內容更改爲更大的大小來稍微放大顯示圖像。 (這是爲了讓我可以稍後平移它。) 由於某些原因,但是設置邊界並不會改變它們或觸發動畫來執行此操作。CALayer邊界在設置爲特定值後不會更改

這是我用它來改變邊界的代碼:我有一個函數來計算的CGRect

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

,但這種虛擬一個可以連接到我們的大小相同的結果不改變。

我也確定,雖然我看不到尺寸變化,但如果在設置後檢查圖層的邊界,它會正確地設置它的值。

設置界限後執行以下代碼。我找不到任何東西,改變了他們。

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

好的。最後一個發生在我身上的事情:如果我使用變換來更改圖層的尺寸,我是否會遇到解決問題的問題?就像我想要的那樣,當我放大時,圖層內容仍然很清晰。 –