2009-09-18 70 views

回答

3

基本上,您需要自己構建功能。您可以在包含完整可拖動區域的超級視圖中通過listening to touches執行此操作。方法hitTest:withEvent:可以告訴您觸點是否在要拖動的標籤中。

從那裏,您可以覆蓋touchesMoved:withEvent:方法來更新UILabel的位置,以保持其與手指對齊。更新標籤的位置將自動爲您重新繪製。

Here's a relevant question for iphone drag/drop

一旦你拖動工作,我還建議注意在第一次觸摸的地方UILabel內的位置,並且以這樣的方式處理重新定位,使得手指總是在UILabel內的那個點上。一個更易於編碼但看起來更糟糕的版本是簡單地將標籤的左上角重新定位爲手指所在的位置,但這可能會使標籤在第一次開始拖動時出現跳躍。

這可能聽起來很嚇人,但它確實不是那麼糟 - 總共只有幾行代碼。除非你有意見可能重疊。這又是幾行,取決於你想如何處理它。

+0

很好的意見會重疊...... – 2009-09-18 01:53:12

+0

一旦你有一個手柄,要在拖動可以移動的標籤,你可以調用[自我bringSubviewToFront:標籤]。它會覆蓋其他一切(如果這就是你想要做的)。 – Tyler 2009-09-18 05:04:13

0
// MARK: - Touch Functions 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    guard let location = touches.first?.preciseLocationInView(quoteView) else { return } 

    if quoteView.pointInside(location, withEvent: event) { 
     locationInView = location.y 
     isInButton = true 
    } else { 
     isInButton = false 
    } 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if isInButton { 

     guard let totalYMovement = touches.first?.preciseLocationInView(self.view).y, 
     locationInView = self.locationInView else { return } 

     var yMovement = totalYMovement - quoteViewLocation 
     if locationInView >= (self.quoteView.frame.height/2) { 
      // Works! 
      yMovement = yMovement - (locationInView - (self.quoteView.frame.height/2)) 
     } else { 
      yMovement = yMovement + ((self.quoteView.frame.height/2) - locationInView) 
     } 

     self.quoteView.transform.ty = yMovement 
    } 
} 

我用上面的代碼來翻譯Y軸的視圖。所述quoteViewLocation變量是一個gettable CGPoint返回

self.view.frame.height/2

locationInView是被設置每一個抽頭要變換被輕敲的視圖的內部由時間可選CGPoint。

您可以使用我的代碼將按鈕放置在您的視圖中的任何位置,只要確保您的quoteViewLocation(無論您將要調用它)變量返回CGPoint.y水平等分視圖。這一點必須是超視圖的相應點。我的意思是,如果你有一個40點的高度和40點的高度的超級視圖的子視圖,並且子視圖被集中在超級視圖的中間,你可能會認爲正確的CGPoint爲返回是20.不是!雖然這是子視圖的正確中心Y,但超視圖的中心是200.返回超視圖的CGPoint。

您必須這樣做才能保持轉換順暢。

如果你想沿x軸移動視圖,它是一樣的想法。

如果我錯過了任何東西或misspoke撕裂我。也試圖在這裏學習。

感謝

相關問題