IOS基礎(chǔ)控件思維導圖
四踩寇、動畫
1窑业、CoreAnimation
(1)CALayer和UIView
? 在CoreAnimation中大多數(shù)效果都是通過CALayer層來實現(xiàn)的磨镶,每一個UIVIew對象都封裝了一個CALayer碎乃,Layer只負責負責存儲視圖的狀態(tài)则酝,不負責進行相應(yīng)處理悔据,UIView是Layer的delegate庄敛。
(2)錨點
? 錨點是一切Animation的基準點,同一個Animation也會因為不同的anchor point不同而展現(xiàn)出不同的效果科汗,錨點有兩個原則:
- 錨點和CALayer.postion重合
- 錨點決定視圖進行動畫時的參照點
(3)幾種常用的CALayer子類
CAGradientLayer:色彩漸變圖層
CAReplicatiorLayer:復制和偏移子圖層達到復制的目的
CAScrollLayer:多個子層的滑動管理藻烤,但是無法進行交互,滾動只能由代碼進行管理
CAShapeLayer:自定義自己想要的形狀
CATextLayer:文字圖層
CATiledLayer:瓦片視圖,可以分區(qū)域進行繪制
-
CATransformLayer:圖層的變化效果隐绵,比如3D效果的轉(zhuǎn)變
?
2之众、Autolayout(非自帶包需自己安裝snapkit)
? 固定組件的尺寸大小往往會導致在不同尺寸的設(shè)備上顯示出現(xiàn)差異,Autolayout的出現(xiàn)正是為了解決這個問題依许。
(1)使用方法
//switch為自己的組件棺禾,makeConstraints內(nèi)為閉包參數(shù)
Switch?.snp.makeConstraints({(maker) in
})
可以約束的屬性如下:
public var top: SnapKit.ConstraintMakerExtendable { get }
public var bottom: SnapKit.ConstraintMakerExtendable { get }
public var right: SnapKit.ConstraintMakerExtendable { get }
public var width: SnapKit.ConstraintMakerExtendable { get }
public var height: SnapKit.ConstraintMakerExtendable { get }
public var size: SnapKit.ConstraintMakerExtendable { get }
public var centerX: SnapKit.ConstraintMakerExtendable { get }
public var centerY: SnapKit.ConstraintMakerExtendable { get }
public var leftMargin: SnapKit.ConstraintMakerExtendable { get }
public var rightMargin: SnapKit.ConstraintMakerExtendable { get }
public var topMargin: SnapKit.ConstraintMakerExtendable { get }
public var bottomMargin: SnapKit.ConstraintMakerExtendable { get }
public var margins: SnapKit.ConstraintMakerExtendable { get }
約束的屬性的方法如下:
public func equalTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable
public func equalToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable
//ConstraintMakerEditable方法,equalTo()后接
public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable
public func dividedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable
public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable
五峭跳、存儲
1膘婶、UserDefault進行簡單數(shù)據(jù)存儲
//首先獲得UserDefault對象,每個程序系統(tǒng)都會默認創(chuàng)建一個UserDefault對象
let UD = UserDefault.standard
//存一個數(shù)據(jù)
UD.set(_obj:Any,forKey:String)
//取一個數(shù)據(jù),類型由:url,bool,double,float,integer,dictionary,array,data
UD.<type>(forKey:String)
//清空
UD.removeObject(forKey:String)
2蛀醉、plist文件進行持久化數(shù)據(jù)存儲
? pilist文件一般作為程序的配置文件悬襟,存儲程序的一些默認參數(shù),但是在有必要的時候也可以作為一種持久化存儲數(shù)據(jù)的方式拯刁,plist以小巧輕便為主脊岳,主要存儲的數(shù)據(jù)類型為基本數(shù)據(jù)類型
//獲取文件path
let path = PlistSetting.getFilePath(File: "myfile.plist")
//獲取以這個plist文件創(chuàng)建的一個似Dicitionay對象,這個對象的鍵值和在plist中的一樣
let dic:NSMutableDictionary = NSMutableDictionary.init(contentsOfFile: path)!
//接著可以用這個dic對plist文件讀取或者存儲
//寫入文件,第二個參數(shù)指定如果數(shù)據(jù)無法寫入的情況下是否自動忽略
open func write(toFile path: String, atomically useAuxiliaryFile: Bool) -> Bool
3垛玻、歸檔技術(shù)
? 歸檔數(shù)也是持久化數(shù)據(jù)存儲的一種方式割捅,它和plist文件方式存儲的最大區(qū)別在于它可以存儲復雜的數(shù)據(jù)
(1)簡單數(shù)據(jù)歸檔
//創(chuàng)建歸檔載體
let mutable = NSMutableData()
//創(chuàng)建歸檔對象
let arc = NSKeyedArchiver(forWritingWith:mutable)
//編碼
arc.encode(_obj:Any,forKey:String)
//完成
arc.finishEncoding()
//寫入文件
mutable.write(toFile:filePath,atomically:bool)
——————————————————————————————————————————————————————————————————————————————
//讀取
//嘗試獲取數(shù)據(jù)源
let data = try?Data(constentsOf:URL(fileURLWithPath:filePath))
//創(chuàng)建解歸檔對象
let uner = NSKeyedUnarchiever(forReadingWith:data!)
//進行歸檔,歸檔的具體類型在代碼提示中有
var d = uner.<..>(forKey:String)
(2)自定義數(shù)據(jù)類型歸檔
? 對于自定義的數(shù)據(jù)在使用歸檔時,必須使要用來歸檔的類遵循NSObject協(xié)議和NSCoding協(xié)議帚桩。并在構(gòu)造方法中實現(xiàn)解構(gòu)亿驾,在encode方法中實現(xiàn)歸檔。
class Man:NSObject,NSCoding{
var name:String = ""
var age:Integer = 0
override init(name:String,age:Integer){
super.init()
self.name = name
self.age = age
}
required init?(coder:aDecoder:NSCoder){
super.init()
self.name = aDecoder.decodeObject(forKey:String) as! String
self.age = aDecode.decodeObject(forKey:String )
}
func encode(with aCode:NSCoder){
aCoder.encode(age,forKey:String)
aCoder.encode(name.forKey:String)
}
}
//歸檔和解歸
//歸檔
let man = Man("Tom",22)
NSKeyedArchiver.archiveRootObject(man,toFile:filePath)
//解檔
let de_man = NSKeyedUnarchiever.unarchivObject(with:filePath) as! Man