可拖動(dòng)的伸縮UIButton

前段時(shí)間總監(jiān)有個(gè)需求讓我實(shí)現(xiàn),就是可伸縮的UIButton

比如:

伸縮UIButton

這個(gè)很簡(jiǎn)單沒有什么好說的。
主要做法就是計(jì)算好view的寬和Button的X.
做完之后總監(jiān)不滿意贯底,認(rèn)為既然可以伸縮常柄,那么就應(yīng)該也可以拖動(dòng)!

好了,又要費(fèi)點(diǎn)事兒了。
所以我們給UIButton 添加一個(gè)擴(kuò)展,在擴(kuò)展文件里添寺,我們重寫UIResponder的方法。

- (void)touchesBegan:(NSSet)touches withEvent:(UIEvent)event;**

- (void)touchesMoved:(NSSet)touches withEvent:(UIEvent)event;**

-(void)touchesEnded:(NSSet)touches withEvent:(UIEvent)event;**

我們分別要重寫這三個(gè)方法懈费,具體三個(gè)方法的實(shí)現(xiàn):

touchesBegan:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    self.highlighted = YES;
    if (![objc_getAssociatedObject(self, DragEnableKey) boolValue]) {
        return;
    }
    begincenter=self.superview.center;
    UITouch *touch = [touches anyObject];
    
    beginPoint = [touch locationInView:self.superview];
}

touchesMoved:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.highlighted = NO;
    [super touchesMoved:touches withEvent:event];
    if (![objc_getAssociatedObject(self, DragEnableKey) boolValue]) {
        return;
    }
    
    UITouch *touch = [touches anyObject];
    
    CGPoint nowPoint = [touch locationInView:self];
    
    float offsetX = nowPoint.x - beginPoint.x;
    float offsetY = nowPoint.y - beginPoint.y;
    
    self.superview.center = CGPointMake(self.superview.center.x + offsetX, self.superview.center.y + offsetY);
}

touchesEnded:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

if (self.superview && [objc_getAssociatedObject(self,AdsorbEnableKey) boolValue] ) {
    if (self.highlighted) {
        [self sendActionsForControlEvents:UIControlEventTouchDown];
        self.highlighted = NO;
    }
    
    CGPoint nowPoint = self.superview.center;
    
    
    float offsetX = nowPoint.x - begincenter.x;
    float offsetY = nowPoint.y - begincenter.y;

    
    if (fabsf(offsetX)<5 && fabsf(offsetY)<5) {
        [super touchesEnded:touches withEvent:event];
        
    }
    
    
    float marginLeft = self.superview.frame.origin.x;
    float marginRight = self.superview.superview.frame.size.width - self.superview.frame.origin.x - self.superview.frame.size.width;
    float marginTop = self.superview.frame.origin.y;
    float marginBottom = self.superview.superview.frame.size.height - self.superview.frame.origin.y - self.superview.frame.size.height;
    
    [UIView animateWithDuration:0.125 animations:^(void){
        if (marginTop<60) {
            self.superview.frame = CGRectMake(marginLeft<marginRight?marginLeft<PADDING?PADDING:self.superview.frame.origin.x:marginRight<PADDING?self.superview.superview.frame.size.width -self.superview.frame.size.width-PADDING:self.superview.frame.origin.x,
                                    PADDING,
                                    self.superview.frame.size.width,
                                    self.superview.frame.size.height);
            
            
        }
        else if (marginBottom<60) {
            
            self.superview.frame = CGRectMake(marginLeft<marginRight?marginLeft<PADDING?PADDING:self.superview.frame.origin.x:marginRight<PADDING?self.superview.superview.frame.size.width -self.superview.frame.size.width-PADDING:self.superview.frame.origin.x,
                                    self.superview.superview.frame.size.height - self.superview.frame.size.height-PADDING,
                                    self.superview.frame.size.width,
                                    self.superview.frame.size.height);
            
        }
        else {
            self.superview.frame = CGRectMake(marginLeft<marginRight?PADDING:self.superview.superview.frame.size.width - self.superview.frame.size.width-PADDING,
                                    self.superview.frame.origin.y,
                                    self.superview.frame.size.width,
                                    self.superview.frame.size.height);
            
        }
    }];
}else{
    [super touchesEnded:touches withEvent:event];
    
}
}

最后要實(shí)現(xiàn)的效果大概就是這樣计露。

最后附上gitHub鏈接,希望能給有同樣需求的你們帶來幫助。

Demo點(diǎn)我下載~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末票罐,一起剝皮案震驚了整個(gè)濱河市叉趣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌该押,老刑警劉巖疗杉,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚕礼,居然都是意外死亡烟具,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門奠蹬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝聋,“玉大人,你說我怎么就攤上這事囤躁〖胶郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵狸演,是天一觀的道長(zhǎng)言蛇。 經(jīng)常有香客問我,道長(zhǎng)宵距,這世上最難降的妖魔是什么腊尚? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮满哪,結(jié)果婚禮上跟伏,老公的妹妹穿的比我還像新娘。我一直安慰自己翩瓜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布携龟。 她就那樣靜靜地躺著兔跌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡蟋。 梳的紋絲不亂的頭發(fā)上坟桅,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蕊蝗,去河邊找鬼仅乓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蓬戚,可吹牛的內(nèi)容都是我干的夸楣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豫喧!你這毒婦竟也來了石洗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤紧显,失蹤者是張志新(化名)和其女友劉穎讲衫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孵班,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涉兽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篙程。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枷畏。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖房午,靈堂內(nèi)的尸體忽然破棺而出矿辽,到底是詐尸還是另有隱情,我是刑警寧澤郭厌,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布袋倔,位于F島的核電站,受9級(jí)特大地震影響折柠,放射性物質(zhì)發(fā)生泄漏宾娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一扇售、第九天 我趴在偏房一處隱蔽的房頂上張望前塔。 院中可真熱鬧,春花似錦承冰、人聲如沸华弓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂屏。三九已至,卻和暖如春娜搂,著一層夾襖步出監(jiān)牢的瞬間迁霎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工百宇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留考廉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓携御,卻偏偏與公主長(zhǎng)得像昌粤,于是被迫代替她去往敵國和親既绕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容