             return -1 * self.offset
         }
         set {
-            self.offset = -1 * self.bound(newValue)
+            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)
         }
     }
 

    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
        }

        }
    }

    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) {
