正文
基于这点我们很容易实现一个简单的最初级版本的scrollView,代码如下:
- (void)panGestureAction:(UIPanGestureRecognizer *)pan {
// 记录每次滑动开始时的初始位置
if (pan.state == UIGestureRecognizerStateBegan) {
self.startLocation = self.bounds.origin;
NSLog(@"%@", NSStringFromCGPoint(self.startLocation));
}
// 相对于初始触摸点的偏移量
if (pan.state == UIGestureRecognizerStateChanged) {
CGPoint point = [pan translationInView:self];
NSLog(@"%@", NSStringFromCGPoint(point));
CGFloat newOriginalX = self.startLocation.x - point.x;
CGFloat newOriginalY = self.startLocation.y - point.y;
CGRect bounds = self.bounds;
bounds.origin = CGPointMake(newOriginalX, newOriginalY);
self.bounds = bounds;
}
}
3. 理解了上边内容的关键点,下边我们将对我们实现的scrollView做一个简单的优化。
通过contentSize限制scrollView的内部空间,实现代码如下
if (newOriginalX
newOriginalX = 0;
} else {
CGFloat maxMoveWidth = self.contentSize.width - self.bounds.size.width;
if (newOriginalX > maxMoveWidth) {
newOriginalX = maxMoveWidth;
}
}
if (newOriginalY
newOriginalY = 0;
} else {
CGFloat maxMoveHeight = self.contentSize.height - self.bounds.size.height;
if (newOriginalY > maxMoveHeight) {
newOriginalY = maxMoveHeight;
}
}
通过contentOffset设置scrollView的初始偏移量,相信大家已经懂了如何设置偏移量了吧?没错我们只需设置view自身bounds的origin是实现代码如下:
- (void)setContentOffset:(CGPoint)contentOffset {
_contentOffset = contentOffset;
CGRect newBounds = self.bounds;