تحريك زجاجة باستخدام UIGestureRecognizer في Swift
لتحقيق هذا السلوك، يمكنك استخدام UIGestureRecognizer
لتحديد سرعة واتجاه حركة إصبع المستخدم. يمكنك استخدام هذه المعلومات لتحديث سرعة دوران الزجاجة. هناك عدة طرق لتحقيق ذلك، وإليك مثالاً بسيطاً يستخدم UIPanGestureRecognizer
لتحقيق هذا الهدف:
-
أضف متغيرين لتتبع موقع اللمسة السابقة والوقت الماضي من أجل حساب السرعة.
مقالات ذات صلة-
تحريك إطارات NSView: أفضل الطرق04/04/2024
-
إزالة عناصر مصفوفة بأمان في Swift03/02/2024
-
استخدم دالة التعريف لـ
UIPanGestureRecognizer
لتحديث سرعة الدوران عند كل تحريك. -
اعتمادًا على اتجاه الحركة، يمكنك زيادة أو تقليل سرعة الدوران.
قد تحتاج إلى ضبط القيم بحسب احتياجات مشروعك، ولكن الفكرة العامة هي استخدام الحركة والسرعة لتحديث الرسومات.
المزيد من المعلومات
لتحقيق هذا السلوك، يمكنك استخدام UIPanGestureRecognizer
لتحديد سرعة واتجاه حركة إصبع المستخدم. يمكنك استخدام هذه المعلومات لتحديث سرعة دوران الزجاجة. إليك مثالاً بسيطاً يستخدم UIPanGestureRecognizer
لتحقيق هذا الهدف:
-
أضف متغيرين لتتبع موقع اللمسة السابقة والوقت الماضي من أجل حساب السرعة.
-
استخدم دالة التعريف لـ
UIPanGestureRecognizer
لتحديث سرعة الدوران عند كل تحريك. -
اعتمادًا على اتجاه الحركة، يمكنك زيادة أو تقليل سرعة الدوران.
قد تحتاج إلى ضبط القيم بحسب احتياجات مشروعك، ولكن الفكرة العامة هي استخدام الحركة والسرعة لتحديث الرسومات.
هنا مثال لكيفية تنفيذ هذا المفهوم:
swiftvar lastPanPoint: CGPoint?
var lastPanTime: TimeInterval?
@IBAction func handlePan(_ recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
lastPanPoint = recognizer.location(in: view)
lastPanTime = CACurrentMediaTime()
} else if recognizer.state == .changed {
let currentPanPoint = recognizer.location(in: view)
let currentTime = CACurrentMediaTime()
let distanceX = currentPanPoint.x - lastPanPoint!.x
let distanceY = currentPanPoint.y - lastPanPoint!.y
let distance = sqrt(distanceX * distanceX + distanceY * distanceY)
let deltaTime = currentTime - lastPanTime!
let rotateView = CABasicAnimation()
rotateView.fromValue = 0
rotateView.toValue = Float(distance) * Float(M_PI) / 180.0
rotateView.duration = deltaTime
rotateView.repeatCount = 0
rotateView.removedOnCompletion = false
rotateView.fillMode = .forwards
rotateView.timingFunction = CAMediaTimingFunction(name: .easeOut)
bottleImageView.layer.add(rotateView, forKey: "transform.rotation.z")
lastPanPoint = currentPanPoint
lastPanTime = currentTime
}
}
في هذا المثال، نقوم بحساب المسافة والزمن بين نقاط اللمسة لتحديث سرعة دوران الزجاجة. تحقق من قيم الثوابت والعمليات الحسابية للتأكد من أنها تتناسب مع احتياجات تطبيقك.