小Q-百度定位及递增递减的Label数字未完待续,持续更新中

开篇

上一篇:小Q项目框架搭建及会动的Tabbar

小Q项目开始了,每天抽出来写的时间不多,但是我会尽可能的多写一些,尽量吧代码都封装一下,为有需要的朋友拿过去用,如发现什么BUG,欢迎大家及时反馈 明天就是周六了,也是平安夜,提前祝大家平安夜快乐,周六日我会不定期直播写代码,开播前,我会到QQ群里通知,欢迎大家来围观(斗鱼直播群 145447833) 今天写的代码不多,加了一个定位,用得百度地图,还有一个Label数字递增递减的效果(我不知道怎么形容,先给大家上个Gif吧,gif效果不是很好,但是在手机上还是蛮漂亮的)

00000.gif

百度定位

定位的代码实际很简单,注册百度地图 APPKEY,对应项目的 Bundel id,详见百度地图API吧, 百度地图开发文档 分析:我们使用的时百度的定位功能,要展示给用户一个位置信息,但不是一个经纬度,给用户经纬度用户也不知道这是哪里啊,是吧,所以我们通过百度定位拿到经纬度后,要通过地理位置反编码,所以,我们需要百度的地理功能,以及反编码功能,代码我简单的封装了一下,如下: 导入文件:

#import <BaiduMapAPI_Base/BMKBaseComponent.h>
#import <BaiduMapAPI_Map/BMKMapComponent.h>
#import <BaiduMapAPI_Location/BMKLocationComponent.h>
#import <BaiduMapAPI_Search/BMKSearchComponent.h>

声明:

@property (nonatomic,strong) BMKMapManager          *manager;

@property (nonatomic, strong)BMKLocationService     *locService;

@property (nonatomic, strong)BMKGeoCodeSearch       *geocodesearch;

签的代理协议

<BMKLocationServiceDelegate,BMKGeoCodeSearchDelegate>

代码实现

+ (GD_BaiduMapLocationObject *)locationObject;
{
    static GD_BaiduMapLocationObject *locationObject = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        locationObject = [[GD_BaiduMapLocationObject alloc]init];
    });
    return locationObject;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.manager = [[BMKMapManager alloc]init];
        BOOL ret = [self.manager start:BAIDU_KEY generalDelegate:nil];
        if (!ret) {
            NSLog(@"开启失败!!");
        }
    }
    return self;
}

#pragma mark  百度定位
- (void)installBasiduMapKit
{
    //初始化百度定位
    self.locService = [[BMKLocationService alloc]init];
    self.locService.delegate = self;
    [self.locService startUserLocationService];
    
    self.geocodesearch = [[BMKGeoCodeSearch alloc]init];
    self.geocodesearch.delegate = self;
    [UserDefaults setObject:@"北京" forKey:@"KCityName"];
}

#pragma mark----BMKLocationServiceDelegate
/**
 *用户位置更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    CLLocationCoordinate2D pt = (CLLocationCoordinate2D){0, 0};
    
    pt = (CLLocationCoordinate2D){userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude};
    BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
    reverseGeocodeSearchOption.reverseGeoPoint = pt;
    BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
    if(flag){
        //反geo检索发送成功
    }else{
        //反geo检索发送失败
        [UserDefaults setObject:@"北京" forKey:@"KCityName"];
    }
    
}

-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
    if (error == BMK_SEARCH_NO_ERROR) {
//        因为我只需要城市名字,城市名字后面都有一个市,根据需求把市切断
        NSString *CityName = [result.addressDetail.city componentsSeparatedByString:@"市"][0];
        [UserDefaults setObject:CityName forKey:
         @"KCityName"];
        //定位成功后拿到城市 停止定位
        [_locService stopUserLocationService];
    }else{
        [UserDefaults setObject:@"北京" forKey:@"KCityName"];
    }
}
- (void)dealloc {
    if (_geocodesearch) {
        _geocodesearch = nil;
    }
    if (_locService) {
        _locService = nil;
    }
}

好了,完成,在需要定位的地方调用,代码如下:

#pragma mark  --  初始化百度地图并开始定位
    [[GD_BaiduMapLocationObject locationObject] installBasiduMapKit];

这时候重点来了,也是比较容易忽略的地方

自iOS8起,系统定位功能进行了升级,SDK为了实现最新的适配,自v2.5.0起也做了相应的修改,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述 NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述

加这个切记,不加的话拿不到位置并打包发到 iTunes的时候会显示版本无效(四天前的文章有讲到过 iOS APP版本构建版本无效

百度定位结束

递增递减的Label数字

这个效果大家在上面的gif中看到了,可能gif是个帧动画,感觉这个很不流畅,像一个一个数字蹦一样,就在我写文章的时候,还有个哥们说,你这很卡啊,计算label的长度,和数组一起变化,其实这个不用担心的,label的宽度是使用的Masonry,比较省心,数字的渐变是使用的POP动画实现代码如下:

GDScrollLabel.h文件

//
//  GDScrollLabel.h
//  GD_XiaoQ
//
//  Created by GuangdongQi on 2016/12/23.
//  Copyright © 2016年 GuangdongQi. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface GDScrollLabel : NSObject

+ (GDScrollLabel *)shaerScrollLabel;

/*
 *  property:   label       要显示数字的Label
 *  property:   fromValue   数字开始值
 *  property:   toValue     数字终点值
 *  property:   duration    从开始时间到结束
 */
- (void)installScrollLabel:(UILabel *)label withFromValue:(CGFloat)fromValue withToValue:(CGFloat)toValue withDuration:(CFTimeInterval)duration;

@end

GDScrollLabel.m文件

//
//  GDScrollLabel.m
//  GD_XiaoQ
//
//  Created by GuangdongQi on 2016/12/23.
//  Copyright © 2016年 GuangdongQi. All rights reserved.
//

#import "GDScrollLabel.h"

@interface GDScrollLabel ()

@property (nonatomic , strong)UILabel *label;

@property (nonatomic , strong)POPBasicAnimation * textProperty;

@end

@implementation GDScrollLabel

+ (GDScrollLabel *)shaerScrollLabel;
{
    static GDScrollLabel *scrollLabel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        scrollLabel = [[GDScrollLabel alloc]init];
    });
    return scrollLabel;
}

- (void)installScrollLabel:(UILabel *)label withFromValue:(CGFloat)fromValue withToValue:(CGFloat)toValue withDuration:(CFTimeInterval)duration
{
    self.label = label;
    self.textProperty = [POPBasicAnimation animationWithPropertyNamed:@"progress"];
    self.textProperty.property = [self animationProperty:label];
    self.textProperty.fromValue = @(fromValue);
    self.textProperty.toValue = @(toValue);
    self.textProperty.duration = duration;
    self.textProperty.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    self.textProperty.delegate = self;
    
    [self pop_addAnimation:self.textProperty forKey:nil];

}

- (POPMutableAnimatableProperty *)animationProperty:(UILabel *)label {
    return [POPMutableAnimatableProperty
            propertyWithName:@"moneyNum"
            initializer:^(POPMutableAnimatableProperty *prop) {
                prop.writeBlock = ^(id obj, const CGFloat values[]) {
                    NSNumber *number = @(values[0]);
                    float num = [number floatValue];
                    label.text = [NSString stringWithFormat:@"%.2f",num];
                };
            }];
}

- (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished{
    
    if (finished) {
        
        //实现缩放动画,和tabbar是一个代码
        POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
        scaleAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
        scaleAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
        scaleAnimation.springBounciness = 60.f;
        //不要加代理,如果有代理是个死循环,一直在动
//        scaleAnimation.delegate = self;
        
        [self.label pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];
        
    }
}

@end

好了,结束,调用方法如下:

[[GDScrollLabel shaerScrollLabel]installScrollLabel:self.label withFromValue:0 withToValue:10000 withDuration:2];

在手机上运行完美,感兴趣的同学可以复制一下看看,几个参数写的很明白了,看一下就会用了。

细心的同学观察到我的导航栏是透明的

Paste_Image.png

其实这里的代码很简单,使用KVC方法

#pragma mark -- 设置导航栏全部透明
- (void)navigationBackgroundColor
{
    [self.navigationController.navigationBar setValue:@0 forKeyPath:@"backgroundView.alpha"];
}

这里没做过多的改动,准备之后把这里改成随着滑动渐变的效果,可能下篇,或者更晚的一片能提到

好今天先到这

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)

今天来说几个问题,一个是对昨天《让我焦灼的四个问题》的升华,不能起博眼球的题目,技术分析给大家兜底了,你们看看有没有类似的问题。 还有几个小问题说说今天的感受和...

3535
来自专栏Crossin的编程教室

【Python 第4课】输入

Hi~Crossin又来了。 可以用编程语言让计算机按你说的指令做事情之后,大家是不是有些跃跃欲试呢?别着急,先回顾一下我们之前几节课。我们到现在一共提到了三种...

3427
来自专栏SAP梦心的SAP分享

惊心动魄的SAP S4客户额度调整运动

      今天一大早,收到商务部发来的消息,说某一个客户的额度超额了,但实际上并未超额。从SAP系统中反馈的额度来看,显示超了2万多。后来经过在BP画面检查信...

2149
来自专栏Android小菜鸡

Android Touch事件传递机制

  Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEv...

2503
来自专栏ChaMd5安全团队

N1CTF2018 APFS&Lipstick题解

APFS题目描述 Apple released the brand new APFS on WWDC 2017 with a bunch of new feat...

36010
来自专栏進无尽的文章

地图| 高德地图源码级使用大全

高德地图提供包括:web前端、Android、iOS、服务器、小程序等平台的地图服务, 地图功能众多,本文记载的只是自己遇到的一些问题,绝大部分功能只要参照官...

5962
来自专栏我杨某人的青春满是悔恨

使用 MVVM 架构时页面跳转逻辑写在哪儿?

之前我一直在 ViewModel 中处理页面跳转逻辑,VC 直接拿到目标页面进行 push/present。前些天 Code Review 时,同事指出理论上 ...

1051
来自专栏即时通讯技术

手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途。如本文内容有不妥之处,请联系JackJiang进行处理!

8992
来自专栏施炯的IoT开发专栏

Mouse Gestures on Windows Mobile

         Windows Mobile设备屏幕比较小,设计合理的UI很重要。众所周知,在PC机上使用的软件,如遨游(Maxthon),是支持鼠标手势的。...

20610
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–现金管理(160)-14银企对账-客户收款-承兑汇票-F-36收到承兑汇票

4.5.2 F-36收到银行承兑汇票 收到客户银行承兑汇票支付应收账款,形成财务记账如下: 借:应收票据 贷:应收账款 ? 输入凭证日期、参照、抬头文本 回...

3158

扫码关注云+社区

领取腾讯云代金券