菜单

mg娱乐场www4355comiOS开发笔记15:地图坐标转换那多少个事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合

2019年3月3日 - mg娱乐场www4355com

    4.图层混合

     使用Instruments中的Core
Animation工具能够检查和测试图层渲染和卡通片的连锁题材,包含图层混合难点,即当七个图层叠加在一起,颜色各异时,处理那样的颜色混合情况会成本GPU财富,监测发现这个区域会变红,别的正规区域为玉石白

mg娱乐场www4355com 1

   
对于UILabel的图层混合难点,将其安装为与背景观一致并裁剪即可。(不会生出离屏渲染)

mg娱乐场www4355com 2 

   参考:Color Blended
Layers

    3.UICollectionviewLayout及瀑布流

    最近选拔了一部分第叁方的UICollectionviewLayout类库,例如CSStickyHeaderFlowLayout,提供header悬停及下拉推广的视差效果等

   
通过自定义UICollectionviewLayout能够灵活自定义很多搭架子功用,以经典的瀑布流为例。

mg娱乐场www4355com 3

   
其特色是cell的可观不均等,首尾间隔要保持一致,如此一来就须要自定义layout来调动cell的布局地点。

    这里cell高度随机生成为40-140里头的数值。

mg娱乐场www4355com 4

    1.地图坐标转换那贰个事

   (1)投影坐标系与地理坐标系

   
 地理坐标系使用三维球面来定义地球上的岗位,单位即经纬度。但经纬度不能精确衡量距离戒面积,也麻烦在平面地图戒总计机荧屏上彰显数据。通过投影的办法得以将其转换到平面包车型地铁影子坐标系,不一样的影子格局恐怕会带来差异的变形及误差,类似于把2个橘子的橘子皮剥开摊平到桌面。

mg娱乐场www4355com 5mg娱乐场www4355com 6

mg娱乐场www4355com 7mg娱乐场www4355com 8

   
 GPS以及iOS系统定点赢得的坐标是地理坐标系WGS1981,Web地图一般用的坐标细是影子坐标系WGS
1981 Web
Mercator,国内出于相关法律法规须求,对国内拥有GPS设备及地图数据都进行了加密偏移处理,代号GCJ-02,那样GPS定位赢得的坐标与地图上的任务正好对应上,特殊的是百度地图在那基础上又进行2遍偏移,所以在处理连串确定地点坐标及连锁地图SDK坐标时需求更换处理下,依照互连网财富,最近有一些当众的更换算法。

   (3)使用百度地图SDK

     
使用百度地图SDK,定位也应用sdk中提供的法子,则获得坐标是百度在GCJ-02基础上再二遍偏移的坐标,假设要将一定坐标展现在苹果地图上,则供给转换来GCJ-02下的坐标,JZLocationConverter提供了三种坐标间的转换方法,

   (2)总结contentSize并转移布局

   
contentSize中首若是莫斯中国科学技术大学学,那里取中度最大那一列的Y值即为collectionview的惊人。

mg娱乐场www4355com 9

   (1)总计并缓存相关布局音讯

mg娱乐场www4355com 10

 
 重点是计算布局那里,第二行Y值都一样,但持续各样cell的惊人不等,需求去调整cell的任务,首先找到近日高度最小的那一列(排列第2行时,全体cell的Y值一致,将第②列当做中度最小的一列恐怕将顶部间距看成是单排中度一致的cell),将cell排列在此列下方,并更新此列的Y值,然后再持续找高度最小的一列,将cell排列在其下方并更新此列Y值,以此类推,不断寻找中度最小的那一列,将继续cell排列在其江湖并立异这一列的Y值,即可形成布局,当然设置cell布局时还要将cell之间的距离考虑进来。mg娱乐场www4355com 11

   (3)参考

     iOS
瀑布流基本落实

    2.block引用循环及检查和测试方法&weak–strong dance

   
使用block须要注意幸免引用循环造成内存难题,如图所示,对于strong属性的property大概复用的cell,都以被self持有只怕说强引用的,在运用block回调前,需求将self表明为3个weak类型的weakSelf再开始展览利用,否则将促成引用循环。

mg娱乐场www4355com 12

mg娱乐场www4355com 13

   
但并不是享有block回调解和处理理中都亟待利用weakSelf,例如self并从未强引用vc,在vc里使用self,是不会招致引用循环的。

mg娱乐场www4355com 14

   
对于接近那种恐怕导致引用循环的地点,使用Instrumens的Leaks工具是检查和测试不出来的,相比较简便的方法是在controller检查和测试“dealloc”是还是不是实行,当然也有大概是其余原因导致,但一旦有引用循环爆发则controller肯定不或者自由,“dealloc”也是心有余而力不足推行的。

   
当然,那是形似情状,有一对卓殊境况例如二十四线程下block,block里的weak变量执行命令前大概早就被放出掉了,那时能够对其__strong
一下,那样系统会在block执行到位后再自由该变量。

   (2)系统定点坐标展现在原生地图、Google地图或高德地图–WGS一九八五转GCJ-02

   
 苹果地图及谷歌(Google)地图用的都以高德地图的多少,所以那二种情况坐标处理方法一致,即将WGS1983坐标转换到偏移后的GCJ-02才足以在地图上科学展现地点。

const double a = 6378245.0;
const double ee = 0.00669342162296594323;

+ (CLLocationCoordinate2D)transform:(CLLocationCoordinate2D) latLng
{
    double wgLat = latLng.latitude;
    double wgLon = latLng.longitude;
    double mgLat;
    double mgLon;

    if ([self outOfChina:wgLat :wgLon ])
    {
        return latLng;
    }
    double dLat = [self transformLat:wgLon-105.0 :wgLat - 35 ];
    double dLon = [self transformLon:wgLon-105.0 :wgLat - 35 ];

    double radLat = wgLat / 180.0 * M_PI;
    double magic = sin(radLat);
    magic = 1 - ee * magic * magic;
    double sqrtMagic = sqrt(magic);
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);
    dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI);
    mgLat = wgLat + dLat;
    mgLon = wgLon + dLon;
    CLLocationCoordinate2D loc2D ;
    loc2D.latitude = mgLat;
    loc2D.longitude = mgLon;

    return loc2D;
}

+ (BOOL) outOfChina:(double) lat :(double) lon
{
    if (lon < 72.004 || lon > 137.8347) {
        return true;
    }
    if (lat < 0.8293 || lat > 55.8271) {
        return true;
    }
    return false;
}

+ (double) transformLat:(double)x  :(double) y
{
    double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y +
    0.2 * sqrt(fabs(x));
    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 *sin(2.0 * x *M_PI)) * 2.0 /
    3.0;
    ret += (20.0 * sin(y * M_PI) + 40.0 *sin(y / 3.0 *M_PI)) * 2.0 / 3.0;
    ret += (160.0 * sin(y / 12.0 * M_PI) + 320 *sin(y * M_PI / 30.0)) * 2.0 /
    3.0;
    return ret;
}

+ (double) transformLon:(double) x :(double) y
{
    double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x));
    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 /
    3.0;
    ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;
    ret += (150.0 * sin(x / 12.0 *M_PI) + 300.0 *sin(x / 30.0 * M_PI)) * 2.0 /
    3.0;
    return ret;
}

   (4)参考

      iOS
地图坐标系转换

      iOS经纬度偏移消除

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图