在开发中增加一点小的用户体验,提问问题的按钮可以拖动,可是小的用户体验却让我们花费很多的时间来调节
按钮实现拖动又不影响点击效果,不建议UIControlEventTouchDragInside
这些事件,不容易判断,建议使用UIPanGestureRecognizer
拖动手势,和点击事件不冲突
{
CGPoint beginPoint;
CGFloat rightMargin;
CGFloat leftMargin;
CGFloat topMargin;
CGFloat bottomMargin;
CGMutablePathRef pathRef;
}
self.askButton = [[UIButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH - 48-15, SCREEN_HEIGHT - 49 - 20 - 48, 48, 48)];
[self.askButton setImage:[UIImage imageNamed:@"wenda--listask"] forState:UIControlStateNormal];
[self.askButton addTarget:self action:@selector(askAction) forControlEvents:UIControlEventTouchUpInside];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
[self.askButton addGestureRecognizer:pan];
[self.view addSubview:self.askButton];
//防止越界,控制移动范围
rightMargin = [UIScreen mainScreen].bounds.size.width-30;
leftMargin = 30;
bottomMargin = [UIScreen mainScreen].bounds.size.height-30-50;
topMargin = 30+64;
pathRef=CGPathCreateMutable();
CGPathMoveToPoint(pathRef, NULL, leftMargin, topMargin);
CGPathAddLineToPoint(pathRef, NULL, rightMargin, topMargin);
CGPathAddLineToPoint(pathRef, NULL, rightMargin, bottomMargin);
CGPathAddLineToPoint(pathRef, NULL, leftMargin, bottomMargin);
CGPathAddLineToPoint(pathRef, NULL, leftMargin, topMargin);
CGPathCloseSubpath(pathRef);
#pragma mark - 手势
- (void)handlePan:(UIPanGestureRecognizer *)pan
{
if (pan.state == UIGestureRecognizerStateBegan) {
beginPoint = [pan locationInView:self.view];
}else if (pan.state == UIGestureRecognizerStateChanged){
CGPoint nowPoint = [pan locationInView:self.view];
float offsetX = nowPoint.x - beginPoint.x;
float offsetY = nowPoint.y - beginPoint.y;
CGPoint centerPoint = CGPointMake(beginPoint.x + offsetX, beginPoint.y + offsetY);
if (CGPathContainsPoint(pathRef, NULL, centerPoint, NO))
{
_askButton.center = centerPoint;
}else{
if (centerPoint.y>bottomMargin)
{
if (centerPoint.x<rightMargin&¢erPoint.x>leftMargin) {
_askButton.center = CGPointMake(beginPoint.x + offsetX, bottomMargin);
}
}
else if (centerPoint.y<topMargin)
{
if (centerPoint.x<rightMargin&¢erPoint.x>leftMargin) {
_askButton.center = CGPointMake(beginPoint.x + offsetX, topMargin);
}
}
else if (centerPoint.x>rightMargin)
{
_askButton.center = CGPointMake(rightMargin, beginPoint.y + offsetY);
}
else if (centerPoint.x<leftMargin)
{
_askButton.center = CGPointMake(leftMargin, beginPoint.y + offsetY);
}
}
}else if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateFailed){
}
}
使用拖动手势避免了很多问题