这几天闲下来,整理下了之前项目中使用的悬浮按钮
大致需求如下:
全屏或可约束平移;
自动吸附,靠左或靠右吸附,类似iPhone手机中的辅助触控的悬浮按钮;
有的还有进度加载等等... 🔪 产品⚔️

整个功能的核心代码就只有70行左右。

/// 平移 手势回调
- (void)handlePan:(UIPanGestureRecognizer*)sender {
if(sender.state == UIGestureRecognizerStateChanged){
{
CGPointtranslation = [sendertranslationInView:[selfsuperview]];
CGFloatnewXOrigin =CGRectGetMinX(self.frame) + translation.x;
CGFloatnewYOrigin =CGRectGetMinY(self.frame) + translation.y;
CGRectcagingArea =self.cagingArea;
CGFloatcagingAreaOriginX =CGRectGetMinX(cagingArea);
CGFloatcagingAreaOriginY =CGRectGetMinY(cagingArea);
CGFloatcagingAreaRightSide = cagingAreaOriginX +CGRectGetWidth(cagingArea);
CGFloatcagingAreaBottomSide = cagingAreaOriginY +CGRectGetHeight(cagingArea);
if(!CGRectEqualToRect(cagingArea,CGRectZero)) {
if(newXOrigin <= cagingAreaOriginX ||
newXOrigin +CGRectGetWidth(self.frame) >= cagingAreaRightSide) {
newXOrigin =CGRectGetMinX(self.frame);
}
if(newYOrigin <= cagingAreaOriginY ||
newYOrigin +CGRectGetHeight(self.frame) >= cagingAreaBottomSide) {
newYOrigin =CGRectGetMinY(self.frame);
}
}
self.frame=CGRectMake(newXOrigin,
newYOrigin,
CGRectGetWidth(self.frame),
CGRectGetHeight(self.frame));
[sendersetTranslation:(CGPoint){0,0}inView:[selfsuperview]];
}
}else if (sender.state == UIGestureRecognizerStateEnded){
CGSizedragBtnSize =self.frame.size;
CGFloatdragBtn_Y =CGRectGetMinY(self.frame);
CGFloatdragBtn_X =0;
CGFloat duration =0.7;//默认时间
//计算出按钮距离边界的差 用作动画时间的计算
CGFloatdifference =1.0;
switch(_remainStyle) {
case MSDragButtonRemainStyleNone:
return;
case MSDragButtonRemainStyleAutomaticMargin:
{
if(self.center.x>=self.cagingArea.size.width/2.0) {
//右
dragBtn_X =self.cagingArea.size.width- dragBtnSize.width;
difference = (self.cagingArea.size.width-CGRectGetMaxX(self.frame)) / self.cagingArea.size.width;
}else{
//左
dragBtn_X =0;
difference = CGRectGetMidX(self.frame) / self.cagingArea.size.width;
}
}
break;
case MSDragButtonRemainStyleAutomaticMarginLeft:
dragBtn_X =0;
difference = CGRectGetMidX(self.frame) / self.cagingArea.size.width;
break;
case MSDragButtonRemainStyleAutomaticMarginRight:
dragBtn_X =self.cagingArea.size.width- dragBtnSize.width;
difference = (self.cagingArea.size.width-CGRectGetMaxX(self.frame)) / self.cagingArea.size.width;
break;
default:
break;
}
//距离越近。动画时间就越短
duration = duration * difference;
[UIView animateWithDuration:duration animations:^{
self.frame=CGRectMake(dragBtn_X, dragBtn_Y, dragBtnSize.width, dragBtnSize.height);
}];
}
}
demo中没有实现点击事件,和隐藏相关代码,可自行根据需求添加即可
如果能帮到你,请给个小星星
网友评论