前言
在開發(fā)過程中穷当,我們偶爾在個(gè)別頁面需要做一個(gè)浮動(dòng)按鈕提茁。這個(gè)按鈕要么加載在當(dāng)前控制器中,要么加載在Window
中馁菜。
為了進(jìn)一步擴(kuò)展茴扁,將按鈕的父視圖擴(kuò)展為任意UIView
.
對于加載在當(dāng)前控制器的情況,我們需要考慮的是是否有navbar
,tabbar
,兼容iOS11
就需要考慮安全區(qū)域的問題汪疮。所以封裝一個(gè)浮動(dòng)按鈕峭火,需要暴露的接口為2個(gè):
/**傳入父View*/
@property(nonatomic,weak) UIView *parentView;
/**安全邊距,主要是針對有Navbar 以及 tabbar的*/
@property(nonatomic,assign)UIEdgeInsets safeInsets;
實(shí)現(xiàn)
為UIButton添加收拾智嚷,然后增加判斷即可卖丸。
-(void)initilize{
self.safeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
//添加手勢
UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(doMoveAction:)];
[self addGestureRecognizer:panGestureRecognizer];
}
-(void)setParentView:(UIView *)parentView{
_parentView = parentView;
}
#pragma mark - 手勢方法
- (void)doMoveAction:(UIPanGestureRecognizer *)recognizer
{
//1、手勢在self.view坐標(biāo)系中移動(dòng)的位置
CGPoint translation = [recognizer translationInView:self.parentView];
CGPoint newCenter = CGPointMake(recognizer.view.center.x + translation.x,
recognizer.view.center.y + translation.y);
//2盏道、限制屏幕范圍:
//上邊界的限制
newCenter.y = MAX(recognizer.view.frame.size.height/2 + self.safeInsets.top, newCenter.y);
//下邊界的限制
newCenter.y = MIN(self.parentView.height - self.safeInsets.bottom- recognizer.view.frame.size.height/2, newCenter.y);
//左邊界的限制
newCenter.x = MAX(recognizer.view.frame.size.width/2, newCenter.x);
//右邊界的限制
newCenter.x = MIN(self.parentView.width - recognizer.view.frame.size.width/2,newCenter.x);
//設(shè)置中心點(diǎn)范圍
recognizer.view.center = newCenter;
//3稍浆、將手勢坐標(biāo)點(diǎn)歸0、否則會(huì)累加
[recognizer setTranslation:CGPointZero inView:self.parentView];
}
示例
示例里,添加到當(dāng)前控制器里有顯示navbar
粹湃,隱藏navbar
, 顯示到Window
上的恐仑,有顯示在自定義View
上的,安全區(qū)域就是個(gè)判斷問題为鳄。
button.safeInsets = UIEdgeInsetsMake(NAVH, 0, ELSareArea , 0);
[self.view addSubview:button];
button.parentView = self.view;
效果
浮動(dòng).gif
demo地址:LXFloatingButton