RPReplay_Final1699613924
实现手指滑动拖动View
支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度
核心代码
- (void)handlePanGesture:(UIPanGestureRecognizer *)p {
CGPoint panPoint = [p locationInView:self.view];
CGPoint currentViewPoint = _dragView.center;
if (p.state == UIGestureRecognizerStateBegan) {
_originalPoint = panPoint;
} else if(p.state == UIGestureRecognizerStateChanged) {
CGFloat moveCenterY = panPoint.y - _originalPoint.y;
CGFloat moveCenterX = panPoint.x - _originalPoint.x;
_moveY += moveCenterY;
_moveX += moveCenterX;
[self.dragView mas_updateConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.view.mas_centerY).offset(_moveY);
make.centerX.mas_equalTo(self.view.mas_centerX).offset(_moveX);
}];
//使用 frame 的话 这样布局
//self.forecastGroupView.center = CGPointMake(currentViewPoint.x + moveCenterX, currentViewPoint.y + moveCenterY);
_originalPoint = panPoint;
} else if (p.state == UIGestureRecognizerStateEnded
|| p.state == UIGestureRecognizerStateCancelled) {
CGFloat groupViewHeight = _dragView.frame.size.height;
CGFloat groupViewWidth = _dragView.frame.size.width;
CGFloat parentViewHeight = self.view.frame.size.height;
CGFloat parentViewWidth = self.view.frame.size.width;
CGFloat centerY = 0.0;
BOOL edit = NO;
if (currentViewPoint.y < groupViewHeight/2) {
centerY = groupViewHeight/2;
_moveY = -(parentViewHeight - groupViewHeight)/2;
edit = YES;
} else if (currentViewPoint.y > parentViewHeight - groupViewHeight/2) {
_moveY = centerY;
_moveY = (parentViewHeight - groupViewHeight)/2;
edit = YES;
} else {
centerY = currentViewPoint.y;
}
CGFloat centerX = 0.0;
if (currentViewPoint.x < groupViewWidth/2) {
centerX = groupViewWidth/2;
_moveX = -(KWidth - groupViewWidth)/2;
edit = YES;
} else if (currentViewPoint.x > parentViewWidth - groupViewWidth/2) {
centerX = parentViewWidth - groupViewWidth/2;
_moveX = (KWidth - groupViewWidth)/2;
edit = YES;
} else {
centerX = currentViewPoint.x;
}
if(edit) {
WeakSelf
[UIView animateWithDuration:.25 animations:^{
//使用 frame 的话 这样布局
//self.forecastGroupView.center = CGPointMake(centerX, centerY);
[weakSelf.dragView mas_updateConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.view.mas_centerY).offset(self->_moveY);
make.centerX.mas_equalTo(self.view.mas_centerX).offset(self->_moveX);
}];
} completion:^(BOOL finished) {}];
}
} else {
NSLog(@" pan state : %zd", p.state);
}
}
连接