iOS懸浮、可拖動、自動吸附螢幕邊緣的按鈕製作
阿新 • • 發佈:2019-02-16
想製作一個按鈕,類似於iPhone 的輔助touch的那個小白點的按鈕。但是注意:千萬不能也做成小白點,可能會導致稽核被拒。
不明白網路上查到的那些,為什麼會那麼複雜,涉及到那麼多的頁面。其實只要在要出現這個按鈕的控制器的.m檔案裡寫幾段程式碼就可以解決,非常輕便,尤其適合開發新手。
首先,在想放這個button的vc裡,建立一個成員物件。
@property (nonatomic,strong)UIButton *spButton
然後就可以開始建立按鈕了,我寫成了一個方法:
//建立可拖動、自動貼近邊緣的 事件上報按鈕
[self initAddEventBtn];
方法的具體內容:
-(void)initAddEventBtn{ UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-71,300,66,66)]; [btn setImage:[UIImage imageNamed:@"shijianshangbao"] forState:UIControlStateNormal]; btn.backgroundColor = [UIColor colorWithWhite:0.88 alpha:0.8]; btn.tag = 0; btn.layer.cornerRadius = 8; [self.view addSubview:btn]; self.spButton = btn; [_spButton addTarget:self action:@selector(addEvent:) forControlEvents:UIControlEventTouchUpInside]; //新增手勢 UIPanGestureRecognizer *panRcognize=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; [panRcognize setMinimumNumberOfTouches:1]; [panRcognize setEnabled:YES]; [panRcognize delaysTouchesEnded]; [panRcognize cancelsTouchesInView]; [btn addGestureRecognizer:panRcognize]; }
醉關鍵的部分來了,實現按鈕的移動事件處理:
至此就大功告成啦。裡面的一些方法、圖片名稱,自行替換成你需要的。- (void)handlePanGesture:(UIPanGestureRecognizer *)recognizer { //移動狀態 UIGestureRecognizerState recState = recognizer.state; switch (recState) { case UIGestureRecognizerStateBegan: break; case UIGestureRecognizerStateChanged: { CGPoint translation = [recognizer translationInView:self.navigationController.view]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); } break; case UIGestureRecognizerStateEnded: { CGPoint stopPoint = CGPointMake(0, SCREEN_HEIGHT / 2.0); if (recognizer.view.center.x < SCREEN_WIDTH / 2.0) { if (recognizer.view.center.y <= SCREEN_HEIGHT/2.0) { //左上 if (recognizer.view.center.x >= recognizer.view.center.y) { stopPoint = CGPointMake(recognizer.view.center.x, self.spButton.width/2.0); }else{ stopPoint = CGPointMake(self.spButton.width/2.0, recognizer.view.center.y); } }else{ //左下 if (recognizer.view.center.x >= SCREEN_HEIGHT - recognizer.view.center.y) { stopPoint = CGPointMake(recognizer.view.center.x, SCREEN_HEIGHT - self.spButton.width/2.0); }else{ stopPoint = CGPointMake(self.spButton.width/2.0, recognizer.view.center.y); // stopPoint = CGPointMake(recognizer.view.center.x, SCREEN_HEIGHT - self.spButton.width/2.0); } } }else{ if (recognizer.view.center.y <= SCREEN_HEIGHT/2.0) { //右上 if (SCREEN_WIDTH - recognizer.view.center.x >= recognizer.view.center.y) { stopPoint = CGPointMake(recognizer.view.center.x, self.spButton.width/2.0); }else{ stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0, recognizer.view.center.y); } }else{ //右下 if (SCREEN_WIDTH - recognizer.view.center.x >= SCREEN_HEIGHT - recognizer.view.center.y) { stopPoint = CGPointMake(recognizer.view.center.x, SCREEN_HEIGHT - self.spButton.width/2.0); }else{ stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0,recognizer.view.center.y); } } } //如果按鈕超出螢幕邊緣 if (stopPoint.y + self.spButton.width+40>= SCREEN_HEIGHT) { stopPoint = CGPointMake(stopPoint.x, SCREEN_HEIGHT - self.spButton.width/2.0-49); NSLog(@"超出螢幕下方了!!"); //這裡注意iphoneX的適配。。X的SCREEN高度演算法有變化。 } if (stopPoint.x - self.spButton.width/2.0 <= 0) { stopPoint = CGPointMake(self.spButton.width/2.0, stopPoint.y); } if (stopPoint.x + self.spButton.width/2.0 >= SCREEN_WIDTH) { stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0, stopPoint.y); } if (stopPoint.y - self.spButton.width/2.0 <= 0) { stopPoint = CGPointMake(stopPoint.x, self.spButton.width/2.0); } [UIView animateWithDuration:0.5 animations:^{ recognizer.view.center = stopPoint; }]; } break; default: break; } [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; }