[ SWIFT ] - 史丹福 StandFord-CS193P-課程5-心得分享-20150729

[ SWIFT ] - 史丹福 StandFord-CS193P-課程4-心得分享-20150726
課程重點:(1)View(2)UIColor(3)UIFont(4)UIImage
(1)View
定義一個空間
畫出一個區域
定義 totuch events等觸碰事件的處理
每個View都只能有一個SuperView,但是可以有多個SubViews
存取時,如果不再同一層的 View會回傳nil

新增View語法:addSubView(SubView)
移除View語法:SubView.removeFromSuperview()

View的建立有2種方法:
A. init(frame: CGRect):透過程式碼產生的view
B. init(Coder:NSCoder)
下圖中綠色字體部分是比較建議的作法,透過func setup進行初始化之後需要的檢查 。

awakeFromUib():只有在StoryBoard才可用,用於對新增的View進行初始化init
以下借用彼得潘的圖說明,可知為何只能在StoryBoard才可用


1. IBOutlet連結的元件要等到viewDidLoad裡才出現。
 如果我們太心急,在awakeFromNib即存取,只會空手而回,取到空氣。(nil)

2. 當記憶體不足時,viewDidUnload可能被呼叫。到時候view controller的畫面要再出現時,viewDidLoad將再度被呼叫。因此viewDidLoad可能被多次呼叫,不適合將只想做一次的事置於其中。比方計數的count變數,若是在viewDidLoad時設定初始值0,那麼當 viewDidLoad再次被呼叫時,辛苦累積多時的count就被清空了,多可惜呀。所以我們最好將設定初始值的程式碼置於initWithCoder: , awakeFromNib, initWithNibName:bundle:。
參考資料來源:http://deeploveapple.blogspot.tw/2012/04/storyboardxib.html

CGFloat:座標,在swift 中所有繪畫、觸碰處理事件等座標單位都是CGFloat。

CGPoint:由x與y組成一個點,xy都是Float

CGSize:在座標中定義長寬
 
CGRect:由CGPoint+CGSize組成
在view座標系中,都要使用CGFloat
let cgf = CGFloat(aDoubleValue)

minX:水平方向上的中點
minY:垂直方向上的中點
intersects:判斷2個矩型是否重疊
intercept:建立2個矩型重疊部分
containspoint:檢查該點是否存在矩型中
contentScaleFactor:回傳點站多少個像素,像素越多表示畫質越好
bounds:控制繪圖的區域,原點為左上方(0,0)

view座標系:
原點在左上角,單位是用point不是pixel,如果你想知道當下的device中一個point等於幾個pixel,你可以呼叫UIView的var contentScaleFactor: CGPoint來查看(目前大部份是2)

在view中繪圖(draw)的邊界
        var bounds: CGPoint //這個view之內的座標系這個UIView的位置
        var center: CGPoint  //這個view的中心點在superview中的座標
        var frame: CGRect   //這個view在superview中的origin與size

//Never call drawRect!!
因為UIView會跟很多其他的view有關聯,所以在drawRect之前系統要先處理這些交互作用。
用下列的func代替,iOS會處理完這些事之後,再幫你呼叫drawRect()
setNeedsDisplay():需要重繪時請呼叫setNeedsDisplay進行重繪
setNeedsDisplayInRect(regionThatNeedsToBeRedrawn: CGRect)
※如果需要進行重繪,永遠不要呼叫drawRect,那是系統呼叫的!! 


自訂自己的View:將新的View拖曳到Storyboard上後,修改Identity Inspector指定給自己的class 就可產生自訂的 View。
 
Graphics:
用來繪製的內容(context)
 例如:產生字母需要,先描邊,再填充
Q:UIBzierPath


UIColor 顏色
說明:
1.支援RGB、HSB,也可以用來設定背景色(background Color)
2.支援alpha(transparency),可以呈現透明色,0:完全透明,1:不透明
Ex:
yellowcolors.ColorWithAlphaComponent(0.5)
※設定透明時需設定opaque:false
3.設定透明時,背景物件的呈現順序是依subview的順序決定
4.利用hidden來設定view是否要呈現,flase出現,true不出現
5.隱藏的view不會有任何作用, 也不會觸發其他event

 Drawing Text
利用NSAttributedString來產生
由於let 和 var 無法為string帶來可變性,因此出現NSMutableAttributedString("xxx"),因為NSMutableAttributedString支援string的Attribute
NSMutableAttributedString並不是String 或NSString的子類
透過addAttributes增加屬性,利用 setAttributes設定屬性

UIFont 字型
preferredFontForTextStyle:設定view呈現的字型,透過設定方式讓系統呈現不同的字體大小,UI會比較漂亮,會比手動設定更適合。
系統預設三種內文字體呈現方式:
Headline:標題(字體較大)
Body:本文(標準字體)
Footnote:註釋(小字)

使用系統自訂的字型和自訂字型
systemFontOfSize:指定系統字體大小
小字(類似註釋):UIFont.systemFontOfSize(UIFont.smallSystemFontSize())
標準大小:UIFont.systemFontOfSize(UIFont.systemFontSize()) 
指定字型大小為25:UIFont.systemFontOfSize(CGFloat(25)) 
斜體字:UIFont.italicSystemFontOfSize(UIFont.labelFontSize())
租體字:UIFont.boldSystemFontOfSize(UIFont.labelFontSize())
指定字型:UIFont(name:"Helvetica Neue", size:UIFont.labelFontSize())
參考資料來源:
http://cms.35g.tw/coding/ios-uifont/ 

UIImage 影像
圖片由Image.xcassets中進行存取
drawAtPoint:在指定點上繪製圖案
drawInRect: 在指定的區域中縮放圖像,可以針對圖片進行縮小或放大,或是將圖像鋪滿整個區域

UIViewContentMode
當User改變設備方向時,邊界改變了,因此需要透過UIViewContentMode來重新設定View的移動方式,例如移動到新邊界的左邊、右邊、上面或下面,或是需要進行縮放(ScallToFill 或 ScalAspectFill共支援三種方式),再利用Redraw重新繪製,如果直接呼叫Redraw還是會產生變形的圖案。


範例:Happiness(笑臉示範)
執行結果:





下這段程式示範真的很重要:
@IBDesignable:讓StoryBoard可以即時呈現。
@IBInspectable:在 Interface Builder 的觀察面板(inspector panel)裡可新增參數直接設定參數值!真的太屌了!XD!





 執行結果:

faceview.swift完整程式碼:
path的原理必須知道:
一個路徑有storked和filled
一個stroke 用當前的stroke顏色來表述path的輪廓
一個fill用當前的fill顏色來填充這個path














留言

熱門文章