iOS 下拉刷新动画之–七彩泡泡

先上完整的效果图,😆Gif效果太差将就看看:

iOS 下拉刷新动画之--七彩泡泡
效果图

主要是利用CAShapeLayer和UIBezierPath,CAEmitterLayer来实现,应为本次重点做的是动画效果
为了节省时间,下拉刷新逻辑就借用了MJRefresh
自定义一个类继承 MJRefreshHeader 支持修改颜色和闲置状态的动画。
默认给了一个😄,大家可以发挥想象。

@interface ZTHeaderRefresh : MJRefreshHeader

@property (nonatomic, strong) UIBezierPath *path;
@property (nonatomic, strong) UIColor *tintColor;

@end

使用方法与MJRefresh相同

 __weak typeof(self) weakSelf = self;
    ZTHeaderRefresh *header = [ZTHeaderRefresh headerWithRefreshingBlock:^{
        [weakSelf requsetData];
    }];
    header.tintColor = [UIColor orangeColor];
//    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 40) cornerRadius:10];
//    header.path = path; 
    self.tableView.mj_header = header;



- (void)requsetData {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.tableView.mj_header endRefreshing];
    });
}

说一下七彩泡泡的实现效果吧,其实也很简单利用CAEmitterLayer发射器实现

- (CAEmitterLayer *)refreshingLayer {
    if (!_refreshingLayer) {
        _refreshingLayer = [CAEmitterLayer layer];
        _refreshingLayer.renderMode = kCAEmitterLayerAdditive;
        _refreshingLayer.emitterShape = kCAEmitterLayerRectangle;
        _refreshingLayer.emitterCells = @[[self getEmitterCell]];
    }
    return _refreshingLayer;
}

//cell
- (CAEmitterCell *)getEmitterCell
{
    CAEmitterCell *cell = [[CAEmitterCell alloc] init];
    CGFloat colorChangeValue  = 1;
    cell.blueRange = colorChangeValue;
    cell.redRange =  colorChangeValue;
    cell.greenRange =  colorChangeValue;

    cell.birthRate       = 5;
    cell.speed           = 5.f;
    cell.velocity        = -20.f;
    cell.velocityRange   = -40.f;
    cell.yAcceleration   = - 20.f;
    cell.emissionRange   = M_PI;
    cell.contents =  (__bridge id )([UIImage imageNamed:@"bubble"].CGImage);
    cell.lifetime        = 15;
    cell.lifetimeRange   = 20;
    cell.scale           = 0.1;
    cell.scaleRange      = 0.3;
    return cell;
}

懒加载一个CAEmitterLayer 配置好cell, bubble 是一个泡泡图片,添加到父View上 。 属性有点多具体含义参考这里

iOS 下拉刷新动画之--七彩泡泡
泡泡发射器

支持自定义闲置动画

iOS 下拉刷新动画之--七彩泡泡
自定义path

Demo代码已经上传到GitHub 传送门

简单的双层波浪动画效果
一行代码实现第三方登录,分享,支付功能

-原文链接-

使用socketIO框架实现iOS的长连接

公司是做金融相关,最近需要实现一个金融客户端必不可少的东西:K线图。这个东西如果是自己从头来搞,可真的不是一件简单的事,幸好,在这个领域有很多的先驱,已经在我们之前造好了轮子等着我们使用,一直对这些乐于分享,乐于开源的大神们抱有感激,希望有一天自己的知识和经验也能对后来人有所帮助。

说起K线图,为了做好这个东西前期也已经研究了很久,最终找到了一份算是不错的K线图demo,地址在这里:https://github.com/WillkYang/YYStock,
有兴趣的可以去看看。但是这篇blog的重点不在K线图上,而是如何实现长连接,让服务端实时推送股票的相关信息给客户端。长连接的技术我之前也是没有接触过,这次一次研究了个爽,找了很多的开源第三方的矿框架,包括:CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket,
Facebook出品的SocketRocket https://github.com/facebook/SocketRocket,
以及今天要说道的socket.io https://github.com/socketio/socket.io-client-swift。
这三个可以实现长连接的框架,都很厉害,但是因为我们的服务端是用socket.io实现的,所以我们客户端使用socket.io相关的也就最容易实现。
最新的是Socket.IO-Client-Swift,一个swift实现的Socket.IO框架,我们如果使用cocopods的话,直接

pod ‘Socket.IO-Client-Swift’

安装好之后,实现长连接就比较简单了:
1)首先在你的viewController中引入这个第三方,

@import SocketIO;

注意是@而不是#import,至于为何这样写请自行百度,这里就不赘述了。
2)引入好了框架,就开始连接

NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"];

//使用给定的url初始化一个socketIOClient,后面的config是对这个socket的一些配置,比如log设置为YES,控制台会打印连接时的日志等
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];

    //监听是否连接上服务器,正确连接走后面的回调
    [socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
        NSLog(@"socket connected");
        [socket emit:@"kline_day" with:@[@"430009"]];
    }];
    //监听new message,这是socketIO官网提供的一个测试用例,大家都可以试试。如果成功连接,会收到data内容。
    [socket on:@"new message" callback:^(NSArray* data, SocketAckEmitter* ack) {
        NSLog(@"response is %@",data);
    }];
    [socket connect];

一般我们真正开发中,需要给服务端传递规定好的关键字,服务端才会正确的返回你想获取的数据,这个时候就要用到emmit()方法:

[socket emit:@"kline_day" with:@[@"430009"]];

上面的意思就是请求服务器430009这个股票代码的日k数据,一般我们将这个请求放在监听连接成功的方法中。
如果想停止本次长连接,也很简单,只需要用上面创建的socket对象调用disconnect()方法即可。

[self.socket disconnect];

这样一个长连接就成功了,之后就是解析获取到的数据,这个数据是每隔一定时间服务器自动推送的,我们是需要把这些数据展示在页面上即可。

-原文链接-