前两介绍了两种实现,分别是:
1.通过添加手势,判断UIGestureRecognizerState的状态来实现
2.通过重新UIControl的触摸事件
这里介绍UIButton作为UIControl的子类的另外一种实现方法:
#import "LBSuspensionFrameFiveViewController.h"
@interface LBSuspensionFrameFiveViewController ()
@property (nonatomic, strong) UIButton *dragFloatView;
@end
@implementation LBSuspensionFrameFiveViewController
- (void)viewDidLoad{
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor whiteColor]];
self.dragFloatView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
[self.dragFloatView setImage:[UIImage imageNamed:@"onion.png"] forState:UIControlStateNormal];
[self.dragFloatView setShowsTouchWhenHighlighted:YES]; //去掉灰亮
[self.dragFloatView addTarget:self action:@selector(dragBegan:withEvent:) forControlEvents:UIControlEventTouchDown];
[self.dragFloatView addTarget:self action:@selector(dragMoving:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[self.dragFloatView addTarget:self action:@selector(dragEnded:withEvent:) forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
[self.view addSubview:self.dragFloatView];
}
- (void) dragBegan: (UIControl *) c withEvent:ev{
NSLog(@"Button moving bagin ......");
}
- (void) dragMoving: (UIControl *) c withEvent:ev{
NSLog(@"Button is moving ..............");
c.center = [[[ev allTouches] anyObject] locationInView:self.view];
}
- (void) dragEnded: (UIControl *) c withEvent:ev{
NSLog(@"Button moving end..............");
// 如果需要随即停顿.
// c.center = [[[ev allTouches] anyObject] locationInView:self.view];
[self moveToEdge];
}
- (void)moveToEdge{
if (self.dragFloatView.center.x <= self.dragFloatView.superview.bounds.size.width * 0.5){
[UIView animateWithDuration:0.7 animations:^{
self.dragFloatView.center = CGPointMake(self.dragFloatView.bounds.size.width * 0.5,
self.dragFloatView.center.y);
}];
}
else{
[UIView animateWithDuration:0.7 animations:^{
self.dragFloatView.center = CGPointMake(self.dragFloatView.superview.bounds.size.width - self.dragFloatView.bounds.size.width*0.5, self.dragFloatView.center.y);
}];
}
}
@end