iPhoneアプリケーションでUILabelをポイントAからポイントBにドラッグするにはどうすればよいですか?
2 に答える
基本的には、自分で機能を構築する必要があります。これを行うには、ドラッグ可能な領域全体を含むスーパービューでタッチを聞きます。このメソッドhitTest:withEvent:
は、タッチダウンポイントがドラッグするラベルにあるかどうかを示します。
そこから、touchesMoved:withEvent:
メソッドをオーバーライドしての位置を更新UILabel
し、指との位置合わせを維持できます。ラベルの位置を更新すると、ラベルが自動的に再描画されます。
ドラッグが機能するようになったらUILabel
、最初のタッチが行われた場所内の場所にも注意を払い、指が常にそのポイントにくるように再配置を処理することをお勧めしUILabel
ます。コーディングは簡単ですが見栄えの悪いバージョンは、たとえば、ラベルの左上隅を指の位置に再配置するだけですが、これにより、最初にドラッグを開始したときにラベルがジャンプしているように見える可能性があります。
恐ろしいように聞こえるかもしれませんが、実際にはそれほど悪くはありません。合計で数行のコードです。重複する可能性のあるビューがない限り。あなたがそれをどのように扱いたいかに応じて、それは別の数行です。
// 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変数は、次の値を返すgettableCGPointです。
self.view.frame.height / 2
locationInViewは、変換されるビュー内でタップがタップされるたびに設定されるオプションのCGPointです。
私のコードを使用して、ビューの任意の場所にボタンを配置できます。quoteViewLocation(これから呼び出すものは何でも)変数が、ビューを水平方向に二等分するCGPoint.yを返すことを確認してください。このポイントは、スーパービューの対応するポイントである必要があります。これが意味するのは、高さが40ポイントの子ビューと、高さが40ポイントのスーパービューがあり、子ビューがスーパービューの中央に中央に配置されている場合、正しいCGPointはリターンは20です。いいえ!これは子ビューの正しい中心Yですが、スーパービューの中心は200です。スーパービューのCGPointを返します。
変換をスムーズに保つためにこれを行う必要があります。
x軸に沿ってビューを移動したい場合も、同じ考えです。
私が何かを逃したり、私に涙を流したりした場合。ここでも学ぼうとしています。
ありがとう