產(chǎn)品需求要實現(xiàn)這個功能畜眨,查資料才發(fā)現(xiàn)原來這么簡單啊
第一版:添加并實現(xiàn)方法
//點擊方法
[_grabBtn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
//拖動
[_grabBtn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
//拖動結(jié)束
[_grabBtn addTarget:self action:@selector(dragEnded:withEvent: )forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
//實現(xiàn)方法
- (void) dragMoving: (UIControl *)c withEvent:event{
c.center = [[[event allTouches] anyObject] locationInView:self.view];
}
- (void) dragEnded: (UIControl *)c withEvent:event
{
c.center = [[[event allTouches] anyObject] locationInView:self.view];
}
第一版基本就實現(xiàn)了拖動功能未舟,然而并不僅僅是實現(xiàn)功能就可以了盗棵,有時候我們還要考慮代碼的優(yōu)化,例如按鈕的位置不能超出屏幕范圍尚辑,于是就有了第二版
第二版
//搶單按鈕拖動
- (void) dragMoving: (UIControl *)c withEvent:event
{
CGPoint center = [[[event allTouches] anyObject] locationInView:self.view];
//不能超出范圍
if (center.x - c.width/ 2 >= 0 && center.x + c.width/ 2 <= kSCREEN_WIDTH && center.y -c.height / 2 >= 0 && center.y + c.height < self.view.height - 10) {
c.center = center;
}
self.isDrag = YES;
}
在測試的時候我們會發(fā)現(xiàn)這樣還有一個問題辑鲤,在拖動結(jié)束后,他還會觸發(fā)點擊事件杠茬,然而這時候我們只想拖動月褥,并不想讓他出發(fā)點擊事件,解決這個問題有兩種方法
- 在拖動時設(shè)置個拖動狀態(tài)標(biāo)記變量瓢喉,在按鈕點擊事件中檢測這個變量宁赤。
- 將按鈕嵌入到另外一個View中,這個View用來響應(yīng)拖動灯荧;而按鈕還是響應(yīng)點擊礁击。
第三版
我采用的是第一種方法
@property (nonatomic) BOOL isDrag; //搶單按鈕是否處于拖動狀態(tài)
//搶單按鈕拖動
- (void) dragMoving: (UIControl *)c withEvent:event
{
CGPoint center = [[[event allTouches] anyObject] locationInView:self.view];
//不能超出范圍
if (center.x - c.width/ 2 >= 0 && center.x + c.width/ 2 <= kSCREEN_WIDTH && center.y -c.height / 2 >= 0 && center.y + c.height < self.view.height - 10) {
c.center = center;
}
self.isDrag = YES;
}
- (void) dragEnded: (UIControl *)c withEvent:event
{
c.center = [[[event allTouches] anyObject] locationInView:self.view];
_btnCenter = c.center; //在這里我用了一個變量存放最后的位置,當(dāng)viewDidLayoutSubviews方法里使按鈕保持在用戶最后選定的位置
self.isDrag = NO;
}
//在點擊方法里做一下判斷
- (void)onGrabAction
{
if (self.isDrag) {
return;
}
//點擊方法
}