--

用code畫國旗

這次的作業是用程式畫出國旗,大家知道在海上有所謂的「國際信號旗」?
既然在海上飄盪了五年,這次要挑一個國際信號旗來當作業!

一開始想做看起來有點難的Y(Yankee),Yankee代表船正在拖著一個船錨。但看了一下畫三角形的程式方法,覺得有點難,想說先來做簡單的Oscar就好,O(Oscar)代表的是人員落水。好端端的人怎麼會落水呢?我還真遇過一次😅

先研究了一下要怎麼畫三角形,結果程式中出現了目前還沒學過的CALayer,我是一個沒辦法矇著眼睛假裝自己會然後硬抄程式的人,只好先研究了一下什麼是CALayer?為什麼畫完三角形不能用,而是要透過這個layer呢?

根據這個網站:https://www.appcoda.com.tw/calayer-introduction/

每個View都是透過layer做為圖形繪製的基礎。

看完有懂一些嗎?

...

..

.

我是沒有。

但總之看了一下範例,我想應該就是畫布的感覺吧~ 🚬

先找出需要的背景色(黃色)的RGB,丟到老師給的網站Schem Color裡查色素,給的是#ffff00,不是我需要的RGB,所以丟到Google大神直接打RGB,居然出現了!google真是我的bff <3

打完以上那一串後... 我大概就卡死了五個小時,一開始看著說明試圖用著自己取的名字來做出旗幟,但就是亂七八糟跑不出來。

最後一邊看著學長姐的code一邊練習。先不要自己亂取名字,先用學長姐的名字,這樣要對錯比較好對。

然後終於就寫出來了!

雖然看著抄都還是會跑不出來,畢竟旗幟不一樣,要自己融會貫通一下!

寫出來後信心滿分,等下要挑戰更難的Yankee.

以下是參考學長姐的code寫出來滴~


import
UIKit
//設定國旗大小var rect = CGRect(x: 0, y: 0, width: 500, height: 500)//設定旗幟名稱,加入view的大小let flag = UIView(frame: rect)//設定國旗底色,用取好的名字flag.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 0/255, alpha: 1)//製作紅色三角形let rectTRI = CGRect(x: 0, y: 0, width: 500, height: 500)//取名字let TAView = UIView(frame: rectTRI)//設定三角形的顏色TAView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)//開始畫三角形let TRI1 = UIBezierPath()var PointA = CGPoint(x: 0, y: 0)TRI1.move(to:PointA)PointA = CGPoint(x:500, y:0)TRI1.addLine(to: PointA)PointA = CGPoint(x: 500, y: 500)TRI1.addLine(to:PointA)TRI1.close()//用CAShapeLayer生成let rectLayer = CAShapeLayer()rectLayer.path = TRI1.cgPath//rectlayer的路線要跟著tri1剛剛走過的路走TAView.layer.mask = rectLayerflag.addSubview(TAView)flag

接下來挑戰一開始覺得有點複雜的Yankee

我先進到咖啡廳,試圖靠著昨天的記憶,自己寫出Yankee的旗幟。不過還是需要不停地回頭看昨天寫的程式。

寫完以後變這樣...

看出來了吧,我自己設定了500*500的方塊,然後按照指標網頁給我的70*70的數據,然後就變這樣了。

所以決定在筆記本上先畫出座標,立刻發現我給自己出了難題。紅黃色區隔每邊為6等分,我做了500*500,根本就很難加減乘除。所以我隨機立斷把500改成600,立刻解決了數學不好的難題。

接下來我卡在對於

let redStripe = CGRect(x: 0, y: 0, width: 600, height: 600)let stripes = UIView(frame: redStripe)stripes.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)

這段令我想不開的程式,覺得到底為什麼要分別寫兩行呢?害我每次都不知道之後addSubview的時候到底要加在哪個名字上。

後來我去youtube看了這支影片

瞬間回復之前做storyboard的記憶。

然後發現應該是我自己+參考的學長姐的名字沒有取清楚(還怪人家)導致自己有點混亂。

如果學另一個學長姐把名字取成

let frameBlue = CGRect
let viewBlue = UIView(frame: frameBlue)

就比較好區分兩個名字的差別。
frameBlue:先設定大小
viewBlue = UIView(frame) :view應用之前設定好的大小

接下來要改顏色什麼的,都以view為基準,因為view才是實實在在的畫紙,frame只是選紙的大小而已,像是A3吧。

之後要畫貝茲曲線UIBezierPath()

let path = UIBezierPath()

就是我現在生出一個叫path的畫筆,這個畫筆要用貝茲曲線這個工具來做圖。

var point = CGPoint(x,y)

var是變數,用var的原因是後面要不停的改落點,所以用變數。一開始我一直把let path跟var point讀成設定未來動向的基準,然後就一直卡死。

後面我發現var point雖然前面有個var,但其實只是宣告變數而已,point開始就可以看作起點了,而不是背景設定。

path.move(to:point)

是說我現在把剛剛拿出來的貝茲曲線工具開始移動,移動到(point)

下一行就說明這個point在哪。

這樣反覆就可以畫出來了。

這樣搞清楚以後,我要回去改我的作業了。

改作業

  1. 取好名字以後真的清楚很多,不會自己左腳踩右腳
  2. 遇到的小問題是使用path.close()的時候,常常會做出奇怪的形狀如下圖

後來研究了一下,發現一定要先寫path1.addLine(to:point1)下面再街上path1.close()才會連好線。在這一塊我有點搞不清楚path1.addline()這邊,到底是先寫點再畫線,還是先畫線再寫點。

但看樣子應該是先宣告畫線再告知去何處吧。所以才會先寫addline然後再跟電腦說addline到關閉曲線的地方(起始點)。

最後終於寫出我滿意的旗幟(雖然覺得中間那槓太寬很奇怪,後來回去改的時候code亂掉... T_T我就放棄了),好在有先拍照

--

--

Leeannnov20
彼得潘的 Swift iOS / Flutter App 開發教室

年近三十來一個武漢肺炎失業,昨天Youtube演算法帶我看到我的生命數字流年走到8,8在流年的尾聲,是收割年,也是為下一個循環開始準備的一年.... 我決定往工程師的路前行。