這幾天閑下來檬寂,整理下了之前項(xiàng)目中使用的懸浮按鈕
大致需求如下:
全屏或可約束平移终抽;
自動(dòng)吸附,靠左或靠右吸附桶至,類似iPhone手機(jī)中的輔助觸控的懸浮按鈕昼伴;
有的還有進(jìn)度加載等等... ? ?? 產(chǎn)品??
整個(gè)功能的核心代碼就只有70行左右。
/// 平移 手勢(shì)回調(diào)
- (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;//默認(rèn)時(shí)間
? ? ? ? //計(jì)算出按鈕距離邊界的差 用作動(dòng)畫時(shí)間的計(jì)算
? ? ? ? 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;
? ? ? ? }
? ? ? ? //距離越近镣屹。動(dòng)畫時(shí)間就越短
? ? ? ? duration? = duration * difference;
? ? ? ? [UIView animateWithDuration:duration animations:^{
? ? ? ? ? ? self.frame=CGRectMake(dragBtn_X, dragBtn_Y, dragBtnSize.width, dragBtnSize.height);
? ? ? ? }];
? ? }
}
demo中沒有實(shí)現(xiàn)點(diǎn)擊事件圃郊,和隱藏相關(guān)代碼,可自行根據(jù)需求添加即可
如果能幫到你女蜈,請(qǐng)給個(gè)小星星