         }
     }
 
-    private var beginTouchPoint: CGPoint!
-    private var beginContentOffset: Double!
-    private var a: Double = 0
+    private struct TouchInfo {
+        var beginPoint: CGPoint
+        var beginDragOffset: Double
+        var offsetFromBeginPoint: Double
+    }
+
+    private var touchInfo: TouchInfo!
 
     func addSubview(polarCoordinated view: PolarCoordinated) {
         if !self.polarCoordinatedSubviews.contains(view) {

    func dragging(recognizer: UIPanGestureRecognizer) {
        switch recognizer.state {
        case .Began:
            self.beginTouchPoint = recognizer.locationInView(self) - self.center
            self.beginContentOffset = self.boundReverse(self.contentOffset)
            self.a = 0
        case .Changed:
            let v = recognizer.locationInView(self) - self.center
            self.a = getNearbyAngle(a: v, b: self.beginTouchPoint, currentPositon: self.a)
            self.contentOffset = self.beginContentOffset + self.a
        case .Ended:
            self.beginTouchPoint = nil
            self.a = 0
        case .Cancelled:
            self.beginTouchPoint = nil
            self.a = 0
        default:
            break
        }

            return -1 * self.offset
        }
        set {
            self.offset = -1 * newValue
            self._dragOffset = self.boundReverse(newValue)
        }
    }

    private var _dragOffset: Double = 0
    private var dragOffset: Double {
        get {
            return self._dragOffset
        }
        set {
            self._dragOffset = newValue
            self.contentOffset = self.bound(newValue)
        }
    }

