iOS 悬浮可拖动可点击按钮
2016-11-28 16:18
519 查看
项目里下完单之后要悬浮红包,类似饿了吗那种。
做完了记录下:
@implementation SearchResultViewController
{
UIButton * moveRedPacket;
}
#pragma mark 红包
//创建移动红包的UI
-(void)CreatMoveRedPacketUI{
UIPanGestureRecognizer * panTouch = [[UIPanGestureRecognizer
alloc]initWithTarget:self
action:@selector(handlePan:)];
if (moveRedPacket==nil) {
moveRedPacket = [[UIButton
alloc]initWithFrame:CGRectMake(ScreenWidth-120,
ScreenHeight-120,
80, 85)];
}
[moveRedPacket
setBackgroundImage:[UIImage
imageNamed:@"red"]
forState:UIControlStateNormal];
[moveRedPacket
addTarget:self
action:@selector(ClickRedPacket:)
forControlEvents:UIControlEventTouchUpInside];
[moveRedPacket
addGestureRecognizer:panTouch];
[self.view
addSubview:moveRedPacket];
}
/**
* 处理拖动手势
*
* @param recognizer 拖动手势识别器对象实例
*/
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
//视图前置操作
[recognizer.view.superview
bringSubviewToFront:recognizer.view];
CGPoint center = recognizer.view.center;
CGFloat cornerRadius = recognizer.view.frame.size.width
/ 2;
CGPoint translation = [recognizer
translationInView:self.view];
//NSLog(@"%@", NSStringFromCGPoint(translation));
recognizer.view.center =
CGPointMake(center.x + translation.x, center.y
+ translation.y);
[recognizer setTranslation:CGPointZero
inView:self.view];
if (recognizer.state ==
UIGestureRecognizerStateEnded) {
//计算速度向量的长度,当他小于200时,滑行会很短
CGPoint velocity = [recognizer
velocityInView:self.view];
CGFloat magnitude =
sqrtf((velocity.x * velocity.x) + (velocity.y
* velocity.y));
CGFloat slideMult = magnitude /
200;
//NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); //e.g. 397.973175, slideMult: 1.989866
//基于速度和速度因素计算一个终点
float slideFactor =
0.1 * slideMult;
CGPoint finalPoint =
CGPointMake(center.x + (velocity.x * slideFactor),
center.y + (velocity.y * slideFactor));
//限制最小[cornerRadius]和最大边界值[self.view.bounds.size.width
- cornerRadius],以免拖动出屏幕界限
finalPoint.x =
MIN(MAX(finalPoint.x, cornerRadius),
self.view.bounds.size.width
- cornerRadius);
finalPoint.y =
MIN(MAX(finalPoint.y, cornerRadius),
self.view.bounds.size.height
- cornerRadius);
//使用 UIView
动画使 view
滑行到终点
[UIView
animateWithDuration:slideFactor*2
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
recognizer.view.center = finalPoint;
}
completion:nil];
}
}
做完了记录下:
@implementation SearchResultViewController
{
UIButton * moveRedPacket;
}
#pragma mark 红包
//创建移动红包的UI
-(void)CreatMoveRedPacketUI{
UIPanGestureRecognizer * panTouch = [[UIPanGestureRecognizer
alloc]initWithTarget:self
action:@selector(handlePan:)];
if (moveRedPacket==nil) {
moveRedPacket = [[UIButton
alloc]initWithFrame:CGRectMake(ScreenWidth-120,
ScreenHeight-120,
80, 85)];
}
[moveRedPacket
setBackgroundImage:[UIImage
imageNamed:@"red"]
forState:UIControlStateNormal];
[moveRedPacket
addTarget:self
action:@selector(ClickRedPacket:)
forControlEvents:UIControlEventTouchUpInside];
[moveRedPacket
addGestureRecognizer:panTouch];
[self.view
addSubview:moveRedPacket];
}
/**
* 处理拖动手势
*
* @param recognizer 拖动手势识别器对象实例
*/
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
//视图前置操作
[recognizer.view.superview
bringSubviewToFront:recognizer.view];
CGPoint center = recognizer.view.center;
CGFloat cornerRadius = recognizer.view.frame.size.width
/ 2;
CGPoint translation = [recognizer
translationInView:self.view];
//NSLog(@"%@", NSStringFromCGPoint(translation));
recognizer.view.center =
CGPointMake(center.x + translation.x, center.y
+ translation.y);
[recognizer setTranslation:CGPointZero
inView:self.view];
if (recognizer.state ==
UIGestureRecognizerStateEnded) {
//计算速度向量的长度,当他小于200时,滑行会很短
CGPoint velocity = [recognizer
velocityInView:self.view];
CGFloat magnitude =
sqrtf((velocity.x * velocity.x) + (velocity.y
* velocity.y));
CGFloat slideMult = magnitude /
200;
//NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); //e.g. 397.973175, slideMult: 1.989866
//基于速度和速度因素计算一个终点
float slideFactor =
0.1 * slideMult;
CGPoint finalPoint =
CGPointMake(center.x + (velocity.x * slideFactor),
center.y + (velocity.y * slideFactor));
//限制最小[cornerRadius]和最大边界值[self.view.bounds.size.width
- cornerRadius],以免拖动出屏幕界限
finalPoint.x =
MIN(MAX(finalPoint.x, cornerRadius),
self.view.bounds.size.width
- cornerRadius);
finalPoint.y =
MIN(MAX(finalPoint.y, cornerRadius),
self.view.bounds.size.height
- cornerRadius);
//使用 UIView
动画使 view
滑行到终点
[UIView
animateWithDuration:slideFactor*2
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
recognizer.view.center = finalPoint;
}
completion:nil];
}
}
相关文章推荐
- iOS自定义悬浮按钮,Objective-C可拖动的浮动按钮,iOS浮动图标,类似AssistiveTouch的浮动漂浮按钮
- 用WindowManager实现一个类似ios悬浮可拖动的虚拟导航按钮
- iOS UIPanGestureRecognizer(拖动手势) 和 点击按钮 实现类似左抽屉的效果
- 仿ios touch按钮创建可随意拖动的悬浮按钮
- iOS悬浮、可拖动、自动吸附屏幕边缘的按钮制作
- 在桌面添加可拖动/点击的悬浮窗口
- 在桌面添加可拖动/点击的悬浮窗口
- ios禁用多按钮同时点击
- 在桌面添加可拖动/点击的悬浮窗口
- iOS 禁用多按钮同时点击效果
- [Win32]只允许最大化最小化窗口,禁止双击标题栏、拖动窗体、点击复原按钮来改变窗口大小
- android仿IOS按钮点击效果,一张图片实现
- ios:点击tablecell中的一个按钮,确定cell所在的行
- iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
- iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
- iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
- iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
- 在桌面添加可拖动/点击的悬浮窗口
- 鼠标点击按钮拖动窗体
- ios 关于 通过加载 xib 生成的view,调用 addsubviews,sub view的按钮 不相应点击事件的 问题