因为项目中添加这个功能然后研究了一下,记录下供以后回顾
[参考]http://www.myexception.cn/operating-system/1924022.html
悬浮按钮的创建和使用
- 通过UIButton直接创建
- 通过UIWindow创建按钮
一. 通过UIButton直接创建
原理:用到了UIButton 的UIControlEventTouchDragInside 这个属性,在拖动的时候的时候重新设置UIButton的中心的点的位置
附部分事件:
UIControlEventTouchDragInside
当一次触摸在控件窗口内拖动时。
UIControlEventTouchDragOutside
当一次触摸在控件窗口之外拖动时。
UIControlEventTouchDragEnter
当一次触摸从控件窗口之外拖动到内部时。
UIControlEventTouchDragExit
当一次触摸从控件窗口内部拖动到外部时。
UIControlEventTouchUpInside
所有在控件之内触摸抬起事件。
部分代码:
[self.btn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
- (void) dragMoving: (UIButton *) c withEvent:ev
{
self.a=1;
c.center = [[[ev allTouches] anyObject] locationInView:self.view];
}
二. 通过UIWindow创建按钮
原理:通过创建一个新的UIWindow,在顶上添加重写之后的UIButton在重写的UIButton里面设置各种的便宜量保证按钮能够依附边界。因为默认的情况下只能存在一个Window我们还需要设置windowLevel。
部分代码:
// 开始触摸,记录触点位置用于判断是拖动还是点击
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
UITouch *touch = [touches anyObject];
_startPos = [touch locationInView:_rootView];
}
手指按住移动过程,通过悬浮按钮的拖动事件来拖动整个悬浮窗口
*/
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// 获得触摸在根视图中的坐标
UITouch *touch = [touches anyObject];
CGPoint curPoint = [touch locationInView:_rootView];
// 移动按钮到当前触摸位置
self.superview.center = curPoint;
}
拖动结束后使悬浮窗口吸附在最近的屏幕边缘
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 获得触摸在根视图中的坐标
UITouch *touch = [touches anyObject];
CGPoint curPoint = [touch locationInView:_rootView];
switch (minDir) {
case LEFT:
{
[UIView animateWithDuration:0.3 animations:^{
self.superview.center = CGPointMake(self.superview.frame.size.width/2, self.superview.center.y);
}];
break;
}
case RIGHT:
{
[UIView animateWithDuration:0.3 animations:^{
self.superview.center = CGPointMake(ScreenW - self.superview.frame.size.width/2, self.superview.center.y);
}];
break;
}
}
网友评论
[self.btn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
为什么UIControlEventTouchDragInside事件,会真的按照- (void) dragMoving: (id) c withEvent:(UIEvent *)ev的参数类型发送呢?