开发Tips收集-2015年11月

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • UICollectionView如果在数据不够一屏时上下滚动 当数据不多,collectionView.contentSize小于collectionView.frame.size的时候,UICollectionView是不会滚动的,可以增加下面代码就可以: self.myCollectionView.alwaysBounceVertical = YES;
  • drawRect & layoutSubviews两个方法都是异步执行,layoutSubviews方便数据计算,drawRect方便视图重绘。
  • drawRect方法使用注意点:
    1. 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
    2. 若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
    3. 若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
  • layoutSubviews在以下情况下会被调用:
    1. init初始化不会触发layoutSubviews。
    2. addSubview会触发layoutSubviews。
    3. 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
    4. 滚动一个UIScrollView会触发layoutSubviews。
    5. 旋转Screen会触发父UIView上的layoutSubviews事件。
    6. 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
    7. 直接调用setLayoutSubviews。
  • drawRect在以下情况下会被调用:
    1. 如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).
    2. 该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
    3. 通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
    4. 直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
      以上1,2推荐;而3,4不提倡
  • ARC 是编译器特性,他不是运行时特性,更不是垃圾回收器「GC」。 ARC 能够解决 iOS 开发中90%的内存管理问题,但是另外10%的内存管理问题是需要开发人员自己处理的,这主要是与底层 Core Foundation 对象交互的部分,底层 Core Foundation 对象由于不在 ARC 的管理下,所以需要自己维护这些对象的引用计数。
  • 在 Xcode 中有「Instruments」工具集可以很方便地检测循环引用。
  • 弱引用虽然持有对象,但是并不增加他的引用计数。弱引用的一个经典使用场景就是委托代理「delegate」协议模式。
  • StoryBoard 的本质是一个 XML 文件,描述了若干窗体、组件、Auto Layout 约束等关键信息。
  • 通过@asmname加stringAppend映射成为Swift函数(注意重新映射的Swift函数名称不一定和C语言函数相同)
  • 任何一个AutoLayout语法都是通过创建一个NSLayoutConstraint约束对象添加到view的约束中去的。
  • 当闭包被声明的时候,抓捕列表就复制一份thing变量,所以被捕捉的值并没有改变,即使你给thing赋了一个新值。
  • 在程序中如果需要创建运动管理器的实例,应由一个实例向整个程序提供加速计和陀螺仪运动服务.因为设备中只有一个加速计和一个陀螺仪,使用单例更合乎逻辑.
  • 在iOS 8下: 如果我们要从字符串第一个字符开始显示下划线,直接从字符串开头设置 NSUnderlineStyleAttributeName 可以正确显示 如果我们是从字符串中间某个字符开始显示下划线,需要从字符串开头设置 NSUnderlineStyleAttributeName 为 NSUnderlineStyleNone方可正确显示
  • 很多ios的应用软件都会滚动显示单个或多个图片,UIScrollView控件主要就是用来 满足这种需求的,展示一张超出屏幕的图片 UIScorllView控件有三个与显示相关的重要属性:contentSize、contentInset和contentOffSet。
  • iOS 的相册是支持保存 GIF 和 APNG 动图的,只是不能直接播放。用 ALAssetsLibrary writeImageDataToSavedPhotosAlbum:metadata:completionBlock可以直接把 APNG、GIF 的数据写入相册。如果图省事直接用 UIImageWriteToSavedPhotosAlbum() 写相册,那么图像会被强制转码为 PNG。
  • iOS9 HTTP 不能正常使用的解决办法
    1. 在Info.plist中添加NSAppTransportSecurity类型Dictionary。
    2. 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES
  • UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观。UIPickerView直接继承了UIView,没有继承UIControl,因此,它不能像UIControl那样绑定事件处理方法,UIPickerView的事件处理由其委托对象完成.
  • UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。
  • 单例模式的要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
  • 要想随意调整xib中view的尺寸,首先要设置size为Freeform
  • 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种 属性列表文件的扩展名是plist,因此也称为Plist文件
  • 无论nib也好,xib也好,最终在执行UIViewController生命周期函数loadView之前,都会转化成可执行的nib文件。
  • storyboard是多个xib文件集合的描述文件,一个xib文件对应着一个视图控制器和多个视图。   
  • iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事
  • 图像简单调整 
  • 色温:GPUImageWhiteBalanceFilter类提供了此功能。该类中有2个属性temperature(最大值10000,最小值1000,正常值5000)和tint(最大值1000,最小值-1000,正常值0.0)
  • 曝光度:GPUImageExposureFilter类提供了此功能。该类中有一个属性exposure,我们可以通过修改此属性值(最大值10.0,最小值-10.0,正常值0.0)
  • 饱和度:GPUImageSaturationFilter类提供了此功能,我们通过修改此类的saturation的属性值(最大值2.0,最小值0.0,正常值1.0)
  • 对比度:GPUImageContrastFilter类提供了此功能。该类中有一个属性contrast,我们可以通过修改此属性值(最大值4.0,最小值0.0,正常值1.0)
  • 色阶:表示图像亮度强弱的指数标准,图像的色彩丰满度和精细度是由色阶决定的。在GPUImage中GPUImageLevelsFilter提供了此功能。
  • GPUImageLevelsFilter定义了修改红色,绿色,蓝色,和所有通道的方法,有效值范围时0.0-1.0之间,如果你想想像ps中那样,你必须先转为[0,1]
  • String 的格式化初始方法可以帮助我们利用格式化的字符串: let format = String(format:”%.2f”,b) print(“double:(format)”) // 输出:double:1.23
  • 发生内存泄露实在找不出问题所在的话,将那个对象直接赋值为nil,因为ARC下对象没有指针指向,马上会被释放。
  • Xcode中 Target -> General中的bundle identifier ; info.plist中的Bundle identifier; 证书中心的Identifiers中App IDs新建App时的Explicit App ID; 以及iTunes Connect中App信息的套装ID 必须保持一致!!