包容iOS 10 资料整理笔记

前言:

  先不管格局, 把他和他的名字都忘了, 来探望问题 和 设计思路.
为何要如此做. 

1.Notification(通知)

自从Notification被引入之后,苹果就持续的更新优化,但那么些更新优化只是小打小闹,直至现在iOS
10发端真正的开展大改重构,那让开发者也体会到UserNotifications的易用,功能也变得那个有力。

  • iOS 9 在此之前的文告

    1.在调用方法时,有些措施令人很难区分,不难写错方法,那让开发者有时候很抑郁。

    2.应用在运行时和非运行时捕获通告的不二法门还不均等。

    3.施用在前台时,是无能为力直接突显远程公告,还需求更进一步处理。

    4.已经暴发的关照是无法立异的,内容爆发时是不能更改的,并且唯有简单文本浮现格局,扩大性根本不是很好。

  • iOS 10 先导的关照

    1.富有有关公告被统一到了UserNotifications.framework框架中。

    2.扩大了吊销、更新、中途仍可以够修改公告的情节。

    3.通知不在是简约的公文了,可以投入视频、图片,自定义布告的展现等等。

    4.iOS
    10针锋相对往日的通报来说更为好用易于管理,并且进行了普遍优化,对于开发者来说是一件好事。

    5.iOS
    10初阶对于权力问题开展了优化,申请权限就相比较不难了(本地与远程布告集成在一个方法中)。

  • iOS 10 通告学习相关材料:

[UserNotifications:

场景:

  有一家商店, 里面有一个营业员, 售货员当然是要卖东西的哇,
客户进来买完东西, 找售货员结账, 那售货员得知道一起多少钱啊?

一. 初叶设计

  商品类:

package org.elvin.strategy;

/***/
public class Goods {
    /**
     * 商品名
     */
    private String name;

    /**
     * 商品价格
     */
    private Long Price;

    public Goods() { }

    public Goods(String name, Long price) {
        this.name = name;
        Price = price;
    }

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getPrice() {
        return Price;
    }

    public void setPrice(Long price) {
        Price = price;
    }
    //endregion
}

 

出于价格我利用的是 Long 类型, 所以, 要有一个更换输出的方法.

package org.elvin.strategy;

import java.text.MessageFormat;

public class MoneyUtils {
    public static String getYuan(Long money){
        Long yuan = money / 100;
        Long jiao = money % 100 /  10;
        Long fen = money % 10;

        return MessageFormat.format("{0}.{1}{2}", yuan, jiao , fen );
    }
}

售货员:

package org.elvin.strategy;

import org.elvin.strategy.calculator.*;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 环境角色(Context)*/
public class Seller {

    /**
     * 姓名
     */
    private String name;

    /**
     * 编号
     */
    private String code;

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
    //endregion

    /**
     * 售卖商品
     */
    public void sellGoods(List<Goods> goods){
        Long sum = 0L;
        for (Goods good : goods) {
            sum += good.getPrice();
        }
        System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
    }

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        sellGoods(goods);
    }
}

来看一下乘除结果:

图片 1

收获结果了, 没啥毛病, 挺好. 

明天主任娘过生日, 突然想到, 要不要再店里搞个运动, 来个促销活动,
有些商品让利销售. 

前几天业主过生日, 高管娘说, 老娘喜气洋洋, 你降价销售, 今日自我来个免单销售.

这现在肿么办啊? 明日过后, 价格自然又要恢复生机到健康价格.  what the fuck! 

Seller类写死了, 难道我在内部加几个计算办法? 

加进去貌似可以解决当下题材, 可是, 后天假设业主的老丈人过生日吗? 咋搞?

 

Ok, 到此地, 差不离, 要求请出后天的大神 : 策略形式.
让她来帮我们解决这一个题材吧.

 

二. 设计改造

对此售货员来说, 她非得了解, 今日该怎么统计价格, 是特惠仍然不优惠,
或者是满多少钱, 送东西怎么的. 

那就是说, 将那几个让利或者说价格的测算方法抽象出来, 成为一个接口或者抽象类. 

让降价或者不降价已毕或者接二连三他.

心想事成情势:

那边, 我将她抽象为一个接口

package org.elvin.strategy.calculator;

import org.elvin.strategy.Goods;

import java.util.List;

/**
 * 抽象策略角色(Strategy)
 * 优惠接口
*/
public interface PreferentialPrice {
    public void getPrice(List<Goods> goods);
}

PreferentialPrice 需要作为一个属性,出现在 Seller 类中.

在Seller中加入

    /**
     * 计算优惠后的价格
     * 抽象角色, 次角色给出所有具体策略类所需的接口
     */
    private PreferentialPrice preferentialPrice;

    public PreferentialPrice getPreferentialPrice() {
        return preferentialPrice;
    }

    public void setPreferentialPrice(PreferentialPrice preferentialPrice) {
        this.preferentialPrice = preferentialPrice;
    }

 

此处提供二种总计办法:

  1. 例行艺术

    /**

    • 切实策略角色(ConcreteStrategy)
      */
      public class NoPreferential implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           sum += good.getPrice();
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  2. 免单格局

    /**

    • 切切实实政策角色(ConcreteStrategy)
      */
      public class Free implements PreferentialPrice {
      @Override
      public void getPrice(List goods) {

       System.out.println("免单, 不要钱 !");
      

      }
      }

  3. 有的降价方式

    /**

    • 具体策略角色(ConcreteStrategy)
      */
      public class ReduceSomeGoods implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           switch (good.getName()) {
               case "泡面":
                   sum += good.getPrice() - 50L;
                   break;
      
               case "火腿":
                   sum += good.getPrice() - 20L;
                   break;
      
               case "鸡蛋":
                   sum += good.getPrice() - 10L;
                   break;
      
               default:
                   sum += good.getPrice();
                   break;
           }
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  

 将Seller类中, 总结的方法修改一下:

    public void sellGoods(List<Goods> goods){
        if(preferentialPrice == null){
            setPreferentialPrice(new NoPreferential());
        }
        preferentialPrice.getPrice(goods);
    }

在测算的时候, 即使没有传到促销, 则默许使用无降价方式

再看测试方法:

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        setPreferentialPrice(new Free());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new ReduceSomeGoods());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new NoPreferential());
        sellGoods(goods);
    }

结果:

  图片 2

策略方式作为一种对象行为方式, 在此间应该仍旧浮现到了吧.

那总结一下?给个不易于通晓(网上抄的):

  策略格局属于对象的作为形式。其打算是本着一组算法,将每一个算法封装到具备协同接口的单身的类中,从而使得它们可以相互替换。策略形式使得算法可以在不影响到客户端的状态下暴发变化。

说的相比较空虚, 来个实际的呢:

  一帅哥喜欢约妹子, 那咋约出来吧? 不是兼具的胞妹都爱好进食看电影吧.
那针对区其他阿妹, 使用分化的格局来约. 约喜欢看电影的妹子看电影,
约喜欢吃小吃的胞妹吃小吃.

这吃饭, 看电影, 吹海风…… 等等, 那个手段,
目标都是为了让四嫂做他女对象(那里不切磋时间). 目标不变, 手段见惯司空.
这几个方式, 就足以知晓为不一致的 strategy. 

 

透过地点的例子, 可以看到, 具体的算法与算法之间平素不借助关系,
都是同等的(平等性), 可以并行替换的. 那在运行的时候,
每回都不得不动用一种(唯一性). 

苹果官方文档](https://link.jianshu.com?t=https%3A%2F%2Fdeveloper.apple.com%2Freference%2Fusernotifications)

苹果官方录像1

苹果官方视频2

苹果官方视频3
活久见的重构 – iOS 10 UserNotifications
框架解析

WWDC2016 Session笔记 – iOS 10
推送Notification新特性

2.ATS的问题

iOS
9中默认HTTP的网络是不推荐应用的,当然我们也得以把NSAllowsArbitraryLoads设置为YES禁用ATS。可是iOS
10从二〇一七年十一月1日起苹果不容许大家经过那么些措施跳过ATS,也就是说强制大家用HTTPS,借使不那样的话提交App可能会被拒绝。可是大家可以透过NSExceptionDomains来针对特定的域名开放HTTP可以简单通过核查。

参照学习小说如下:
关于 iOS 10 中 ATS
的问题

3.iOS 10 隐衷权限设置

iOS 10
开端对隐衷权限更加严峻,借使你不安装就会直接崩溃,现在无数相见崩溃问题了,一般解决办法都是在info.plist文本添加对应的KeyValue就足以了。

以上Value值,圈出的红线部分的文字是显得给用户看的,须要自己丰富规范的唤醒表明,不可能为空。近日解决办法基本都同样,参考学习小说如下:
包容iOS
10:配置获取隐衷数据权限评释

4.Xcode 8 运行一堆没用的logs解决办法

上图我们看看,自己新建的一个工程啥也没干就打印一堆烂七八糟的东西,我觉着那些相应是Xcode 8的题目,具体也没细研商,解决办法是设置OS_ACTIVITY_MODE : disable如下图:

相关题材连连:
stackoverflow问答

5.iOS 10 UIStatusBar方法过期:

在我们开发中有可能用到UIStatusBar一对性能,在iOS 10
中这么些方式已经过期了,借使你的类型中一蹴而就的话就得需求适配。下面的图片也能发现,即使在iOS
10中您必要采用preferredStatusBar比如那样:

//iOS 10 
- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

6.iOS 10 UICollectionView 性能优化

乘胜开发者对UICollectionView的深信,项目中用的地点也正如多,但是照旧存在一些问题,比如偶尔会卡顿、加载慢等。所以iOS
10
UICollectionView进而的优化,因为叙述起来相比较复杂成本时间,在那里只提供就学参考作品如下:
WWDC2016 Session笔记 – iOS 10
UICollectionView新特性

7.iOS 10 UIColor 新增方法

以下是官方文档的辨证:

Most graphics frameworks throughout the system, including Core Graphics,
Core Image, Metal, and AVFoundation, have substantially improved support
for extended-range pixel formats and wide-gamut color spaces. By
extending this behavior throughout the entire graphics stack, it is
easier than ever to support devices with a wide color display. In
addition, UIKit standardizes on working in a new extended sRGB color
space, making it easy to mix sRGB colors with colors in other, wider
color gamuts without a significant performance penalty.

Here are some best practices to adopt as you start working with Wide
Color.

  • In iOS 10, the UIColor class uses the extended sRGB color space and
    its initializers no longer clamp raw component values to between 0.0
    and 1.0. If your app relies on UIKit to clamp component values
    (whether you’re creating a color or asking a color for its component
    values), you need to change your app’s behavior when you link
    against iOS 10.
  • When performing custom drawing in a UIView on an iPad Pro (9.7
    inch), the underlying drawing environment is configured with an
    extended sRGB color space.
  • If your app renders custom image objects, use the new
    UIGraphicsImageRenderer class to control whether the destination
    bitmap is created using an extended-range or standard-range format.
  • If you are performing your own image processing on wide-gamut
    devices using a lower level API, such as Core Graphics or Metal, you
    should use an extended range color space and a pixel format that
    supports 16-bit floating-point component values. When clamping of
    color values is necessary, you should do so explicitly.
  • Core Graphics, Core Image, and Metal Performance Shaders provide new
    options for easily converting colors and images between color
    spaces.

因为事先大家都是用RGB来安装颜色,反正用起来也不是特地多样化,这一次新增的形式应该就是一个弥补吧。所以在iOS
10
苹果官方指出大家运用sRGB,因为它性能更好,色彩更丰盛。如若您协调为UIColor写了一套分类的话也可尝试替换为sRGBUIColor类中新增了八个Api如下:

+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

8.iOS 10 UITextContentType

// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.

@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil

在iOS 10
UITextField添加了textContentType枚举,提醒文本输入区域所希望的语义意义。

应用此属性可以给键盘和系统音讯,关于用户输入的情节的意料的语义意义。例如,您可以指定一个文本字段,用户填写收到一封电子邮件确认uitextcontenttypeemailaddress。当您提供有关您希望用户在文件输入区域中输入的内容的信息时,系统可以在少数情状下活动拔取适用的键盘,并升高键盘改良和主动与任何文件输入机会的结合。

9.iOS 10 字体随开始机系统字体而更改

当我们手机系统字体改变了今后,那大家Applabel也会随之一块变化,那需求大家写过多代码来进一步处理才能兑现,但是iOS
10
提供了那样的性能adjustsFontForContentSizeCategory来安装。因为从没真机,具体实际操作还没去完毕,若是知道错误协理指正。

  UILabel *myLabel = [UILabel new];

   /*
    UIFont 的preferredFontForTextStyle: 意思是指定一个样式,并让字体大小符合用户设定的字体大小。
   */
    myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline];

 /*
 Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
 For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
 */
     //是否更新字体的变化
    myLabel.adjustsFontForContentSizeCategory = YES;

10.iOS 10 UIScrollView新增refreshControl

iOS 10 未来只假诺一而再UIScrollView那么就协助刷新成效:

@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;

11.iOS 10 判断系统版本正确姿势

判定系统版本是我们平日利用的,尤其是现行大家都有可能需求适配iOS
10,那么问题就涌出了,如下图:

咱俩赢得了答案是:

//值为 1
[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]
//值为10.000000
[[UIDevice currentDevice] systemVersion].floatValue,
//值为10.0
[[UIDevice currentDevice] systemVersion]

之所以说判断系统方法最好或者用前边的三种艺术,哦~我忘记说了[[UIDevice currentDevice] systemVersion].floatValue以此艺术也是不可靠的,好像在8.3本子输出的值是8.2,记不知道了反正是不可靠的,所以提议我们用[[UIDevice currentDevice] systemVersion]那一个主意!

Swift判断如下:

  if #available(iOS 10.0, *) {
            // iOS 10.0
            print("iOS 10.0");
        } else { }

参考文章如下:
iOS 平时工作之常用宏定义大全

12.Xcode 8 插件不能用的问题

世家都升高了Xcode 8,可是对于插件依赖的开发者们,一边哭着一面去网上查找解决办法。那么上面是解决办法:
让你的 Xcode8
继续选择插件

不过看到小说最终的诠释,我们明白假设用插件的话,可能安全上会有题目、并且付诸审核会被拒绝,所以提出我们要么不要用了,解决办法总是有些,比如在Xcode中添加注释的代码块也是很有益于的。

13.iOS 10发端项目中一些文字显示不全问题

我用Xcode 8Xcode 7.3个别测试了下,如下图:

Xcode 8

Xcode 7

开创一个Label接下来让它自适应大小,字体大小都是17说到底输出的幅度是分歧的,我们再看一下,上面的数量就驾驭干什么升级iOS 10
之后App中一些文字突显不全了:

Xcode 8打印 Xcode 7.3打印
1个文字宽度:17.5 1个文字宽度:17
2个文字宽度:35 2个文字宽度:34
3个文字宽度:52 3个文字宽度:51
4个文字宽度:69.5 4个文字宽度:68
5个文字宽度:87 5个文字宽度:85
6个文字宽度:104 6个文字宽度:102
7个文字宽度:121.5 7个文字宽度:119
8个文字宽度:139 8个文字宽度:136
9个文字宽度:156 9个文字宽度:153
10个文字宽度:173.5 10个文字宽度:170

英文字母会不会也有那种题材,我又通过测试,后来察觉英文字母不是问题,唯有汉字有问题。近日唯有一个一个修改控件解决那些题材,暂时没有别的好点子来化解。

14.Xcode 8行使Xib awakeFromNib的告诫问题

(本条更新于:2016-09-18)
Xcode 8事先大家选用Xib初始化- (void)awakeFromNib {}都是那样写也没怎么问题,可是在Xcode 8会有如下警告:

设若不喜欢那一个警示的话,应该肯定的充分[super awakeFromNib];咱俩来看看官方认证:

You must call the super implementation of awakeFromNib to give parent
classes the opportunity to perform any additional initialization they
require. Although the default implementation of this method does
nothing, many UIKit classes provide non-empty implementations. You may
call the super implementation at any point during your own
awakeFromNib method.

15.Xcode 8编译过慢的题材

(本条更新于:2016-09-20)
过两个人都反映Xcode 8从不事先编译快了,甚至有些人慢的辣眼睛。可是自己的尚未感到很慢,跟以前大概,我觉着跟电脑应该有一部分挂钩吗,有的开发者几个月不重启电脑,电脑里运行一堆线程,一堆没用的污染源。上面是加速Xcode编译的法子,感兴趣的能够去看一下:
增加Xcode编译速度

16.iOS 10 ImagePickerController.cameraViewTransform问题

(本条更新于:2016-09-21)
广大人反映自定义相机出现了问题,cameraViewTransform不可能用了,其实网上关于那些的素材不是多多益善,在此地提供参考办法如下:

  • 经过监听AVCaptureSessionDidStartRunningNotification来解决

  //#import <AVFoundation/AVFoundation.h>
  //监听
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraNotification:) name:AVCaptureSessionDidStartRunningNotification object:nil];
  //监听方法
  - (void)cameraNotification:(NSNotification *)notification {
    dispatch_async(dispatch_get_main_queue(), ^{
          // 这里实现
          imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(50,  50);
      });
  }

本文只为整理iOS 10 相关材料,也参照部分网上的稿子,还会陆续更新任何iOS
10 相关材料,以及支出中遭受的问题等等。
本小说头阵地址:http://www.jianshu.com/p/0cc7aad638d9
iOS 10
苹果官方文档