可移动的浮动按钮
可移动的浮动按钮
mikey961890 发表于1年前
可移动的浮动按钮
  • 发表于 1年前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

摘要: 项目过程中需要就自己写了一个, 简单移动, 靠边站的按钮

自定义代码.h

//  ZMFloatButton.h

//  xinzibao

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 jiangzhenmin. All rights reserved.

//

#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

#define SCREEN_WIDTH  ([UIScreen mainScreen].bounds.size.width)

#import <UIKit/UIKit.h>

@class ZMFloatButton;

@protocol ZMFloatButtonDelegate <NSObject>

 

@required

 

- (void)floatTapAction:(ZMFloatButton *)sender;

 

@end

@interface ZMFloatButton : UIView<UIGestureRecognizerDelegate>

@property (nonatomic, assign) id<ZMFloatButtonDelegate> delegate;

@property (nonatomic, strong) UIImageView *bannerIV;//浮标的imageview

@property (nonatomic, assign) BOOL isMoving;//是否可移动

 

@end

自定义代码.m

//  ZMFloatButton.m

//  xinzibao

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 jiangzhenmin. All rights reserved.

//

 

#import "ZMFloatButton.h"

//点击后扩大的大小

#define SCALESIZE 5

#define __async_main__ dispatch_async(dispatch_get_main_queue()

 

typedef NS_ENUM (NSUInteger, LocationTag)

{

    kLocationTag_top = 1,

    kLocationTag_left,

    kLocationTag_bottom,

    kLocationTag_right

};

@implementation ZMFloatButton

{    

    float _nLogoWidth;//浮标的宽度

    float _nLogoHeight;//浮标的高度

    

    LocationTag _locationTag;

    float _w; //有效活动宽度

    float _h; //有效活动高度

}

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code

        _nLogoWidth = frame.size.width;

        _nLogoHeight = frame.size.height;

        self.isMoving = YES;

        self.backgroundColor = [UIColor clearColor];

        self.bannerIV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, _nLogoWidth, _nLogoHeight)];

        //此处表示正常情况下父视图的有效范围, 其他尺寸自行更改

        _w = SCREEN_WIDTH;

        _h = SCREEN_HEIGHT-49-64;

        //_bannerIV.image = [UIImage imageNamed:@"publishAdd"];

        _bannerIV.layer.cornerRadius = 23.f;

        _bannerIV.layer.masksToBounds = YES;

        _bannerIV.backgroundColor = [UIColor orangeColor];

        _bannerIV.userInteractionEnabled = YES;

        _bannerIV.alpha = 0.8f;

        [self addSubview:_bannerIV];

        _locationTag = kLocationTag_right;

        _nLogoWidth = frame.size.width;

        _nLogoHeight = frame.size.height;

        self.userInteractionEnabled = YES;

        UITapGestureRecognizer *publishTap= [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];

        publishTap.delegate = self;

        [_bannerIV addGestureRecognizer:publishTap];

    }

    return self;

}

 

- (void)tapAction{

    [self.delegate floatTapAction:nil];

}

#pragma mark - UIResponder

 

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

{

    

}

 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSLog(@"touchesCancelled");

}

 

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

{

    if (!_isMoving) {

        return;

    }

    [self computeOfLocation:^

     {

         

     }];

}

 

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

{

    if (!_isMoving) {

        return;

    }

    UITouch *touch = [touches anyObject];

    CGPoint movedPT = [touch locationInView:[self superview]];

    

    if (

        movedPT.x - self.frame.size.width/2 < 0.f

        ||

        movedPT.x + self.frame.size.width/2 > _w

        ||

        movedPT.y - self.frame.size.height/2 < 0.f

        ||

        movedPT.y + self.frame.size.height/2 > _h

        )

    {

        return;

    }

    NSLog(@"横坐标:%.2f", movedPT.x);

    NSLog(@"纵坐标:%.2f", movedPT.y);

    

    [self setCenter:movedPT];

    

}

- (void)computeOfLocation:(void(^)())complete

{

    

    float x = self.center.x;

    float y = self.center.y;

    CGPoint m = CGPointZero;

    m.x = x;

    m.y = y;

    //取两边靠近--------------------------

    if (x < _w/2)

    {

        _locationTag = kLocationTag_left;

    }else

    {

        _locationTag = kLocationTag_right;

    }

    switch (_locationTag)

    {

        case kLocationTag_top:

            m.y = 0 + _bannerIV.frame.size.width/2;

            break;

        case kLocationTag_left:

            m.x = 0 + _bannerIV.frame.size.height/2+12;

            break;

        case kLocationTag_bottom:

            m.y = _h - _bannerIV.frame.size.height/2;

            break;

        case kLocationTag_right:

            m.x = _w - _bannerIV.frame.size.width/2-12;

            break;

    }

    

    //这个是在旋转是微调浮标出界时

    if (m.x > _w - _bannerIV.frame.size.width/2)

        m.x = _w - _bannerIV.frame.size.width/2;

    if (m.y > _h - _bannerIV.frame.size.height/2)

        m.y = _h - _bannerIV.frame.size.height/2;

    

    [UIView animateWithDuration:0.1 animations:^

     {

         [self setCenter:m];

     } completion:^(BOOL finished)

     {

         complete();

     }];

}

 

@end

引入控制器

//  ViewController.m

//  FloatButtonTest

//

//  Created by mac on 2017/2/7.

//  Copyright © 2017年 Mikey. All rights reserved.

//

 

#import "ViewController.h"

#import "ZMFloatButton.h"

@interface ViewController ()<ZMFloatButtonDelegate>

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor lightTextColor];

    ZMFloatButton * floatBtn = [[ZMFloatButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH-60, SCREEN_HEIGHT-176, 46, 46)];

    floatBtn.delegate = self;

    //floatBtn.isMoving = NO;

    floatBtn.bannerIV.image = [UIImage imageNamed:@"publishAdd"];

    [self.view addSubview:floatBtn];

    [self.view bringSubviewToFront:floatBtn];

}

#pragma mark -ZMFloatButtonDelegate

- (void)floatTapAction:(ZMFloatButton *)sender{

    //点击执行事件

}

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 2
码字总数 676
×
mikey961890
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: