- Thrown Errors
- Any & AnyObject
- Custom Drawing
- Other Interesting Classes
- NSObject
- NSNumber
- Date
- Data
- Views
- Coordinate System Data Structures
- View Coordiante System
- Fonts
- Drawing Images
- CustomStringConvertible
๋งจ ๋ค์ throws
ํค์๋๋ฅผ ๋ถ์ฌ์ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
func save() throws
throws ๊ฐ ๋ถ์ ํจ์๋ ์๋ฌ๋ฅผ ๋์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ธ์ง ์๋ฌ๋ฅผ ์ก์์ค์ผ ํฉ๋๋ค.
do-catch
๊ตฌ๋ฌธ์ผ๋ก throws ํจ์๋ฅผ ์ฒ๋ฆฌํด์ค๋๋ค. ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ ์์ง๋ง ํ๋ฒ ์คํํด๋ณธ๋ค๋ ์๋ฏธ๋ก ํจ์ ์์ try
๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํฉ๋๋ค.
์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด catch ๊ตฌ๋ฌธ์ผ๋ก ๊ฐ๊ณ Error ํ๋กํ ์ฝ์ ๊ตฌํ์ฒด NSError
๋ ํจ๊ป ํ์ธํ ์ ์์ต๋๋ค.
do {
try context.save()
} catch let error {
// ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ด๊ณณ์ผ๋ก ๋ ๋ผ์จ๋ค.
// let error๋ ๋ฐ์ํ error์ ์ง์ญ๋ณ์๋ก Error protocl์ ๊ตฌํ์ฒด์ด๋ค.
}
do-catch ๊ตฌ๋ฌธ์ด ์ซ๋ค๋ฉด, try!
๋ฅผ ์ฌ์ฉํ ์๋ ์๋๋ฐ, ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฑ์ ๊ฐ์ ์ข
๋ฃ์ํต๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๊ณ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฆ ์ ์ฐ์ด์ง ์์ต๋๋ค.
try! context.save()
๋ง์ฐฌ๊ฐ์ง๋ก do-catch ๊ฐ ์ซ๊ณ ์ฌ๊ฐํ์ง ์์ ์๋ฌ๋ผ๋ฉด, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก try?
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฑ์ ๋ฉ์ถ์ง ๋ง๊ณ ์๋ฌ๋ฅผ ๋ฌด์ํฉ๋๋ค. ๋ง์ฝ ๊ฐ์ ๋ฐํํ๋ ค๊ณ ํ๋ค๋ฉด optional
๋ก ๋ฐ๊ฟ์ ๋ฆฌํดํด์ค๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๊ฐ์ ์ฃผ๊ณ ์๋๋ผ๋ฉด nil์ ๋ฐํํฉ๋๋ค.
let x = try? errorProneFunctionThatReturnsAnInt() // x: Int?
Any
ํ์
๊ณผ ๋์ผํ AnyObject
๋ผ๋ ํ์
๋ ์์ต๋๋ค. ํด๋์ค ํ์
์ ํํด์ ์ฌ์ฉํ ์ ์๋ any๋ฅผ ์๋ฏธํฉ๋๋ค. ์ญ์ swift ์
์ฅ์์ ๋ฌ๊ฐ์ง ์์ ๋
์์ผ๋ก any์ ๋ง์ฐฌ๊ฐ์ง๋ก Objective-C ์์ ํธํ์ฑ์ ์ํด์ ์กด์ฌํฉ๋๋ค.
Objective-C์๋ id ๋ผ๋ ์ค์ํ ํ์ ์ด ์๋๋ฐ, id๋ ์ด๋ค ๊ฒ๋ ๋ ์ ์๊ณ ๊ฑฐ์ ๋ชจ๋ api์์ ์ฌ์ฉ๋ฉ๋๋ค.
Any ํ์ ๋ณ์๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ํด๋์ค ๋ฑ ๋ค์ํ ํ์ ์ด ๋ ์ ์์ต๋๋ค.
Any ํ์
์ ์ฌ์ฉํ ๋๋ ์ฐ๋ฆฌ๊ฐ ์๋ ํ์
์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํฉ๋๋ค. ์ด๋ as?
๋ฅผ ์ฌ์ฉํ๊ณ ํ์
์ ๋ณํํ ์ ์์ผ๋ฉด ๋ฐ๊ฟ์ฃผ๊ณ ์๋๋ผ๋ฉด nil์ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ as? ๋ก ๋ณํ์์ผ์ฃผ๋ฉด Optional ํ์
์ด ๋ฉ๋๋ค.
let unknown: Any
if let foo = unknown as? MYType {
// foo: Mytype
}
as๋ Any ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ํ์
์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฃผ๋ก ์์ ํด๋์ค ํ์ ํด๋์ค๋ก ๋ณํํ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ downcasting
์ด๋ผ๊ณ ํฉ๋๋ค. class ๋ฟ๋ง ์๋๋ผ protocol
์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
let vc: UIViewController = ConcentrationViewController()
if let cvc = vc as? ConcentrationViewContrller {
cvc.flipCard(...) // UIViewController๊ฐ ์๋ ConcentrationViewController์ ๋ฉ์๋
}
NSObject๋ ๋ชจ๋ objective-c ํด๋์ค์ root ํด๋์ค ์ ๋๋ค.
UIViewController ๊ฐ์ UIKit์ ๋ชจ๋ ํด๋์ค๊ฐ Objective-C ์์ ๊ฐ๋ฐ๋์๋๋ฐ, ์ฌ์ ํ Objective-C์ ํธํ์ด ๊ฐ๋ฅํ๊ณ ์ด ํด๋์ค๋ค์ด ๋ชจ๋ NSObject
ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์์ต๋๋ค.
Objective-C ์์๋ NSObject ํด๋์ค๋ฅผ ์์๋ฐ์ง ์์ผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง๋ง, Swift ์์๋ NSObject ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์๋ ์์ต๋๋ค. ๋จ, ๋ช๋ช ์์์ API ๋ค์ด NSObject ํด๋์ค๋ฅผ ์๊ตฌํ๊ธฐ๋ ํฉ๋๋ค.
Objective-C ์์๋ ์ซ์๋ฅผ ์ ๋ฌํ ๋ ์ด Class๋ฅผ ์ด์ฉํฉ๋๋ค. Swift์์๋ Double ์ด๋ Int๋ Struct์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค๊ฐ ์์ง๋ง, Objective-C ์๋ ์กด์ฌํฉ๋๋ค.
๊ฐ์ฒด์งํฅ ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด NSNumber
๋ฅผ ์ฌ์ฉํฉ๋๋ค. NSNumber๋ ์์๋ ์ ์ ๋ฟ๋ง ์๋๋ผ Boolean ๊น์ง๋ ๊ฐ๋ฅํฉ๋๋ค.
iOS์์ ๋ง์ API๊ฐ NSNumber ํด๋์ค๋ฅผ ์ทจํ์ง๋ง, ์๋์ผ๋ก Swift ํ์ ์ผ๋ก bridge ๋ฉ๋๋ค. ๋ฐ๋ผ์ NSNumber ๋ฐ๋ก ์ ํ์๋ ์๊ณ Swift์์ NSNumber๋ก ๋ญ๊ฐ๊ฐ ๋ ๋ผ์๋๋ผ๋ ๊ทธ๋ฅ ์ด๋ค ํ์ ์ผ๋ก ์๊ฐํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
let n = NSNumber(35.5) or let n: NSNumber = 35.5
let intified: Int = n.intValue // or doubleValue, boolValue, etc ...
let boolean: Bool = n.boolValue // true
Date๋ ๋ ์ง๋ ์๊ฐ์ ํํํ๋ ํ์ ์ ๋๋ค. ๋ด๋ถ์ ์ผ๋ก๋ 1970๋ ์ดํ๋ก ๋ช ์ด๊ฐ ํ๋ ๋์ง ํํ๋๊ณ , ์์ฃผ ์ ๋ฐํ ๋จ์๋ก ๋ฐฑ๋ง๋ถ์ 1์ด ๋จ์๋ก ์ธก์ ํฉ๋๋ค.
Calendar
, DateFormatter
, DateComponents
๋ฑ์ ํด๋์ค๊ฐ ์ข
์ข
ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์๋ํ๋ฉด Date๋ฅผ ๊ณง๋ฐ๋ก UI์ ๋๋ ๋งค์ฐ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ ์ธ๊ณ์์ ๋ ์ง๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํํ๋ฉ๋๋ค.
Data๋ bit๊ฐ ๋ด๊ฒจ์๋ ๊ฐ๋ฐฉ์ ๋๋ค. iOS API ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธํฐ๋ท์ ์ด๋ค URL์์ ์ด๋ฏธ์ง๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด bit ๊ฐ๋ฐฉ์ธ Data๋ฅผ ํ์ธํด์ ์ํ๋ UIImage ๋ฑ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก JSON ๋ฑ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Data๋ ๊ทธ์ bit ๊ฐ๋ฐฉ์ด๋ฏ๋ก ์ํ๋ ํํ๋ก ๊บผ๋ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. bit๋ฅผ ๋ค์ํ ํด๋์ค๋ก ๋ฐ๊ฟ ์ ์๋ ๋ฉ์๋๋ค์ด ์กด์ฌํฉ๋๋ค.
View
๋ ๋ ๊ฐ์ง ์๋ฏธ๋ก ํด์๋ฉ๋๋ค.
-
MVC ์
V
๋ก ViewController์ ๋ถ์ด์๋ ๋ง์ view ๋ค์ ์๋ฏธํฉ๋๋ค. -
iOS์ ํด๋์ค์ธ UIVIew์ ์๋ธ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
UIView์ ์๋ธ ํด๋์ค
๋ ์ขํ๊ณ๋ฅผ ์ ์ํ๋ ํ๋ฉด์ ์ง์ฌ๊ฐํ์ ๋งํฉ๋๋ค. ์ด ์ขํ๊ณ๋ drawing ํ ๋ ์ฌ์ฉํ๊ณ ์๊ฐ๋ฝ์ ์ด์ฉํด ๋ฉํฐํฐ์น๋ฅผ ํ ๋์๋ ์ฌ์ฉํฉ๋๋ค.
์ง์ฌ๊ฐํ ์์ ์ง์ฌ๊ฐํ, ์ฆ View ์์ View๊ฐ ์๋ ๊ณ์ธต ๊ตฌ์กฐ(Hierarchical)
๋ฅผ ๊ฐ์ต๋๋ค.
View๋ ๊ทธ View๊ฐ ์ํด์๋ ํ๋์ Superview๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ UIView? ํ์
์ด ๋ฉ๋๋ค.
๋ View๋ ๋ง์ Subviews๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
var superview: UIView?
var subviews: [UIView]
View ๋ค์ ์ต์์์ UIWindow
๋ฅผ ๊ฐ์ต๋๋ค. iOS ์ฑ์์ ๋ฑ ํ๋๋ง ์กด์ฌํฉ๋๋ค. ์ญ์ View์ด๋ฏ๋ก UIView์ ์๋ธํด๋์ค ์
๋๋ค.
View์ ๊ณ์ธต ๊ตฌ์กฐ๋ xcode์ storyboard ๊ฐ์ interface builder ๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, code๋ก๋ ํ ์ ์์ต๋๋ค.
์ถ๊ฐํ ๋๋ ์์ ๋ทฐ์ func addSubview(_ view: UIView)
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ์ ๋ทฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ ๊ฑฐํ ๋๋ ํ์ ๋ทฐ ์ func removeFromSuperview()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์์ ๋ทฐ์์ ํ์ ๋ทฐ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
var superView = UIView()
var secondView = UIView()
var thirdView = UIView()
supverView.addSubview(subView)
subView.addSubview(thirdView)
/*
superView
๏พค subView
๏พค thridView
*/
thridView.removeFromSuperview()
/*
superView
๏พค subView
*/
ViewController ์์ var view: UIView
๊ฐ view์ ์ต์์์ ์์นํฉ๋๋ค.
๋ณดํต ๊ฐ๋ฅํ๋ฉด initializing๋ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ํ์ง๋ง ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์๋ค๋ฉด ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ทฐ์๋ ๋ณดํต ๋ ์ข ๋ฅ์ initialze๊ฐ ์กด์ฌํฉ๋๋ค.
-
init(frame: CGRect) // ์ฝ๋๋ก ์์ฑํ ๋
-
init(coder: NSCoder) // interface builder(์คํ ๋ฆฌ๋ณด๋)๋ก ์์ฑํ ๋
NSCoder๋ผ๋ coder๋ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ ์ ์ค๋จ์์ผฐ๋ค๊ฐ ์ฑ์ด ์คํ๋๋ฉด ๋ค์ ์ด๋ ค๋ด๋ ๋งค์ปค๋์ฆ์ ๊ฐ๊ณ ์๋ ํ๋กํ ์ฝ์ ๋๋ค.
์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผ ํฉ๋๋ค.
์๋ํ๋ฉด frame๊ณผ ํจ๊ป ์ฐ์ด๋ init์ ์ง์ ๋ ์ด๋์ ๋ผ์ด์ ๋ผ์ ์ฝ๋์์ ๋ทฐ๋ฅผ ์์ฑํ ๋ค ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด ํ์ํฉ๋๋ค.
coder์ ํจ๊ป ์ฐ์ด๋ Init์ UIView๊ฐ NSCoder ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค.
setup๊ณผ ๊ฐ์ ๊ณตํต ํจ์๋ฅผ ๋ง๋ค๊ณ ๋ ๊ฒฝ์ฐ์ ๋ชจ๋ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ๋ณ์๋ super.init์ ์ ์ ๋ชจ๋ ์ด๊ธฐํ๊ฐ ๋์ด์ผ ํ๋ฏ๋ก, setup ์์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฏธ๋ฆฌ ์ด๊ธฐํ๊ฐ ๋์ด์์ด์ผ ํฉ๋๋ค.
func setup() { ... }
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
UIView๋ฅผ ์ด๊ธฐํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ awakeFromNib()
๋ฅผ ์ฐ๋ ๊ฒ์
๋๋ค. awakeFromNib()๋ ์ธํฐํ์ด์ค ๋น๋์์ ๋์จ ๋ชจ๋ ์ค๋ธ์ ํธ์๊ฒ ๋ณด๋ด์ง๋๋ค. ์ธํฐํ์ด์ค ๋น๋ ํ์ผ์์ ๋์จ ๋ทฐ๋ง awakeFromNib๊ฐ ํธ์ถ๋๋๋ฐ, ์ธํฐํ์ด์ค ๋น๋๊ฐ ๋ค์ ์ด์๋ฌ์ ๋, ์ฆ ์ธํฐํ์ด์ค ๋น๋์ ์ค๋จ์ด ํด์ ๋์์ ๋๋ง awakeFromNib๊ฐ ํธ์ถ ๋ฉ๋๋ค. frame ์ ์ฌ์ฉํด ์์ฑ๋ View์์๋ ์ด ํจ์๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค.
Nib๋ ์ธํฐํ์ด์ค ๋น๋ ํ์ผ์ ์๋ ์ด๋ฆ์ ๋๋ค. Ib์ Nib๊ฐ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ๋ปํฉ๋๋ค.
ํ๋ฉด์ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์ ์์ ๋จผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ผ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์๋ณผ ์ฐจ๋ก์ ๋๋ค.
์์ ๋ชจ๋ CG๊ฐ ๋ถ๋๋ฐ CG๋ Core Graphics ๋ฅผ ๋ปํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก iOS์์ ์ฝ์ด ๊ทธ๋ํฝ์ค๋ 2์ฐจ์ ๋๋ก์์ ํ๊ธฐ ์ํ ์์คํ ์ ๋ปํฉ๋๋ค.
์ฝ์ด ๊ทธ๋ํฝ์ค๋ 4๊ฐ์ ํ์ ์ ๊ฐ๊ณ ์์ต๋๋ค.
๋๋ก์์ ๋ถ๋ ์์์ ์ซ์๋ฅผ ์ขํ๋ก ํ๋ ์์คํ ์์ ์ด๋ฃจ์ด์ง๋๋ค. ๋ทฐ์ ์ขํ ์์คํ ์์ ์ ์๋ Double, Float์ด ์๋ CGFloat์ด ๊ธฐ๋ณธ ์ขํ๊ฐ์ด ๋ฉ๋๋ค. ๋ฌผ๋ก CGFloat์๋ initializer๊ฐ ์์ด์ Double ์ด๋ Float ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
let cgf = CGFloat(aDouble)
CGFloat ํ์ ์ธ ๋ณ์ x, y ๊ฐ ๋ค์ด์๋ ๊ตฌ์กฐ์ฒด ์ ๋๋ค.
CGFloat ํ์ ์ ๋์ด, ๋๋น๊ฐ ๋ค์ด์๋ ๊ตฌ์กฐ์ฒด ์ ๋๋ค.
CGPoint์ CGSize๋ฅผ ๊ฒฐํฉํ ๊ตฌ์กฐ์ฒด ์ ๋๋ค. CGRect๋ ์ง์ฌ๊ฐํ์ ๋ปํฉ๋๋ค.
๋ง์ ์ด๋์ ๋ผ์ด์ ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
struct CGRect {
var origin: CGPoint
var size: CGSize
}
// example
var minY: CGFloat // ์ผ์ชฝ ์ ๋ชจ์๋ฆฌ
var midY: CGFloat // ์์ง ์ค๊ฐ ๊ฐ
intersects(CGRect) -> Bool // ๋ค๋ฅธ ์ง์ฌ๊ฐํ๊ณผ ๊ฒน์น๋์ง ํ์ธ
intersect(CGRect) // ๋ ์ง์ฌ๊ฐํ์ด ๊ฒน์น๋ ๋ถ๋ถ์ ๋ฆฌํด
contains(CGPoint) -> Bool // ํด๋น ์ ์ด ํฌํจ๋๋์ง ํ์ธ
๋ทฐ๊ฐ ๊ทธ๋ ค์ง 2์ฐจ์ ์ขํ๊ณ์ ๋๋ค. iOS ์์ ์ขํ๊ณ๋ ์ผ์ชฝ ์ (0, 0) ๋ฅผ ์์์ ์ผ๋ก ํฉ๋๋ค.
์ด ์ขํ๊ณ์ ๋จ์๋ ํฌ์ธํธ points ๋ผ๊ณ ํฉ๋๋ค. ํฝ์ pixels ๊ณผ๋ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค.
ํ ํฌ์ธํธ ๋น ํฝ์ ์ด ์ผ๋ง๋ ๋ง๋์ ๋ฐ๋ผ ํด์๋๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
ํฝ์ ์ ์คํฌ๋ฆฐ์ ๊ตฌ์ฑํ๊ณ ์๋ ์์ ์ ์ผ๋ก ๋ ํฐ๋ ๋์คํ๋ ์ด ๊ฐ์ ํ๋ฉด์๋ ํฝ์ ์ด ๋ง์ ํด์๋๊ฐ ๋์ต๋๋ค. ํฝ์ ์ด ๋ง์ผ๋ฉด ์ข์ ์ด์ ๋ ํฌ์ธํธ์ ๊ฒฝ๊ณ๋ฅผ ๊ทธ๋ฆด ๋ ๋ ์ธ์ธํ๊ฒ ๊ทธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. 27ํฌ์ธํธ์์ 28ํฌ์ธํธ๋ก ์ฎ๊ฒจ๊ฐ๋ค๊ณ ํ ๋, ์ ํด์๋์์ ํฝ์ ์ ํ๋์ฉ ์ฐ๋๋ค๊ณ ํ๋ค๋ฉด ๊ณ ํด์๋์์๋ 27.2, 27.5 ๋ฑ ๋ ์ธ์ธํ๊ฒ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
๋ทฐ๊ฐ ๊ฐ์ง๊ณ ์๋ CGRect ๋ณ์ ์ ๋๋ค. ๋ทฐ๋ ๊ฐ๊ฐ ์์ ์ ์ขํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. bounds ๋ ์๊ธฐ ์์ ์ ๋ํ ์ขํ๊ณ ์ ๋ณด์ ๋๋ค. ์ฆ, ๊ธฐ๋ณธ์ ์ผ๋ก bounds์ origin์ ํญ์ (0, 0)์ด ๋๊ณ ์์ ์ ๋๋น์ ๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ทฐ๋ฅผ ๊ทธ๋ฆด ๋๋ bounds๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด์๋ ๋ค๋ฅด๊ฒ frame ๋ณ์๋ ์๋๋ฐ, frame์ ๋๋ก์๊ณผ๋ ์ ํ ๊ด๊ณ๊ฐ ์์ต๋๋ค. frame๋ CGRect ํ์ ์ด์ง๋ง ์ํผ ๋ทฐ์์ ์์ ์ด ์ด๋ ์๋์ง๋ฅผ ๋ํ๋ ๋๋ค. frame์ ์์ ์ ์ขํ๊ณ๊ฐ ์๋๋ผ ์ํผ ๋ทฐ์ ์ขํ๊ณ๋ฅผ ๋งํฉ๋๋ค.
๋ ๋น์ทํ๊ฒ center ๋ํ ์ง๊ธ ๋๋ก์ํ๋ ์์ญ์ ์ค์ฌ์ด ์๋๋ผ ์ํผ ๋ทฐ์ ์ ์ฅ์์ ๋ณธ ๋ทฐ์ ์ค์ฌ์ ์๋ฏธํฉ๋๋ค.
์ฆ frame๊ณผ center๋ ์ง๊ธ ์ด๋์ ๊ทธ๋ฆฌ๊ณ ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๊ณ , bounds๋ ์ง๊ธ ๊ทธ๋ฆฌ๋ ๊ณณ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ ๋๋ค.
frame๊ณผ bounds์ ๋์ด์ ๋๋น๊ฐ ๊ฐ๋ค๊ณ ์๊ฐํ ์ ์๋๋ฐ, ๊ฐ์ ํ์๊ฐ ์๊ณ ํญ์ ๊ฐ์ง๋ ์์ต๋๋ค.
๋ทฐ๋ฅผ ํ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ทฐ ์์ฒด์ ๋์ด์ ๋๋น๋ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ bounds๋ ๊ทธ๋๋ก๊ฒ ์ง๋ง, ํ์ ํ๋ ์์ญ์ ๋ชจ๋ ๊ฐ์ธ์ผ ํ๊ธฐ ๋๋ฌธ์ frame์ ๋ ์ปค์ง๋๋ค.
๋ทฐ์ ์์ฑ์ ์ธํฐํ์ด์ค ๋น๋์ ์ฝ๋๋ก ํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค ๋น๋์์๋ ๋ทฐ ์ค๋ธ์ ํธ๋ฅผ ๋์ด๋ค ๋์ผ๋ฉด ๋๊ณ
์ฝ๋๋ก๋ ํด๋น ๋ทฐ์ ํ๋ ์์ ์ค์ ์์ฑํ ์ ์์ต๋๋ค. ๋ง์ฝ ํ๋ ์์ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด ๋ทฐ์ ์ข์๋จ ๋ชจ์๋ฆฌ์ธ (0,0)์ ๋ง์ถฐ์ง๋๋ค.
addSubview๋ฅผ ํตํด ๋ทฐ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
let myView = UIView(frame: otherView) // otherView์ ํ๋ ์๊ณผ ๋์ผํ ๋ทฐ ์์ฑ
let defaultView = UIView() // origin (0,0)์ ๋ทฐ ์์ฑ
view.addSubview(myView)
iOS์์ ์ง์ ๋ทฐ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ฐ์ ์์ต๋๋ค.
override func draw(_ rect: CGRect)
UIView์ draw ๋ฉ์๋๋ก ๋ทฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
๋จ, ์ด draw ํจ์๋ ์ ๋ ์ง์ ํธ์ถํด์๋ ์๋ฉ๋๋ค.
๋ง์ฝ ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ณ ์ถ๋ค๋ฉด, ๋ค์ ๋ ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํฉ๋๋ค. draw ํจ์๋ ์ค์ง iOS ์์คํ ๋ง ํธ์ถํ ์ ์์ต๋๋ค.
setNeedsDisplay(_ rect: CGRect) ๋ฉ์๋์์ rect๋ ์ต์ ํ๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ทฐ ์ ์ฒด๊ฐ ์๋๋ผ ํน์ ๋ทฐ๋ง ๋ค์ ๊ทธ๋ ค๋ ๋๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ๋๊ฒ ํจ์จ์ ์ด๊ฒ ์ฃ . ๊ทธ๋ฌ๋ ๋๋ฌด ๋ง์ ์์์ ์ฐ๊ฑฐ๋ 3D ๊ทธ๋ํฝ์ด ์๋๋ผ ์ฝ๊ฒ ๊ทธ๋ฆด ์ ์๋ ๋ทฐ๋ผ๋ฉด rect๋ ๋ฌด์ํด๋ ๊ด์ฐฎ์ต๋๋ค.
setNeedsDisplay()
setNeedsDisplay(_ rect: CGRect) // ํ์ํ ๋ถ๋ถ๋ง ๋ค์ ๊ทธ๋ฆฐ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ง์ง ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ฝ์ด ๊ทธ๋ํฝ์ค๋ฅผ ์ด์ฉํ๊ฑฐ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก UIBezierPath ํด๋์ค๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋จผ์ ์ฝ์ด ๊ทธ๋ํฝ์ค์์ ๋๋ก์ํ๋ ๊ฒ์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์์๋ณด๊ฒ ์ต๋๋ค.
- Contexts ๊ฐ์ ธ์ค๊ธฐ
์ฝ์ด ๊ทธ๋ํฝ์ค๋ ์ปจํ ์คํธ contexts๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. UIBezierPath๋ ์๋์ผ๋ก ์ปจํ ์คํธ๋ฅผ ์ป์ด์ค์ง๋ง, UIBezierPath๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ปจํ ์คํธ๋ฅผ ์ป์ด์์ผ ํฉ๋๋ค.
Swift์ ์ ์ญ๋ณ์์ธ UIGraphicsGetCurrentContext()
๋ฅผ ์ฌ์ฉํด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๋๋ก์ ํ ์ปจํ
์คํธ๋ฅผ ์๋ ค์ค๋๋ค.
ํ์ง๋ง ์ถ๋ ฅ์ ํ๊ฑฐ๋ ํ๋ฉด์์ ๋๋ก์์ ๊ป๋ค ์ผฐ๋ค ํ ์ ์๋ ๋ค๋ฅธ ์ปจํ ์คํธ๋ ์์ ์ ์๋๋ฐ, draw(_ rect: CGRect) ์์๋ UIGraphicsGetCurrentContext() ๋ง์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
- Path ์์ฑ (out of lines or arcs, etc)
- attributes ์ค์ (colors, fonts, textures lineWidths, lineCaps, etc)
- ์์ ์ค์ ํ path์ attributes์ ๋ฐ๋ผ ์ ์ ๊ทธ๋ฆฌ๊ฑฐ๋ ์ฑ์๋๋ค. (stroke or fill)
์์์ ์ง์ ์์ ํด์ฃผ๋ path, attributes, stroke ๋ฑ๋ฑ์ ์์ ๋ค์ด ๋ด๊ฒจ์๋ ๊ฐ๋ฐฉ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์ต๋๋ค.
์ด์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
UIBezierPath๋ฅผ ์ฌ์ฉํด ์ผ๊ฐํ์ ๊ทธ๋ฆฐ๋ค๋ฉด ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค.
// UIBezierPath ์์ฑ
let path = UIBezierPath()
// ๊ฒฝ๋ก ๊ทธ๋ฆฌ๊ธฐ
path.move(to: CGPoint(80, 50))
path.addLine(to: CGPoint(140, 150))
path.addLine(to: CGPoint(10, 150))
// ํ์ํ๋ค๋ฉด close๋ฅผ ์์ ์์น๋ก ๋ง๋ฌด๋ฆฌ
path.close
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฉด์๋ ์๋ฌด๋ฐ ๋ณํ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ์ด๊ฑด ๋จ์ํ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ์ ๋ฟ, ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ค๋ฉด attributes ์ stroke, fill ๋ฑ์ ์ค์ ํด ์ด๋ป๊ฒ ๊ทธ๋ฆด์ง ์๋ ค์ค์ผ ํฉ๋๋ค.
UIColor.green.setFill()
UIColor.red.setStroke()
path.lineWidth = 3.0
path.fill()
path.stroke()
์ด๋ฐ์๋ clip ๋ฑ ๋ค์ํ ์ผ์ ํ ์ ์์ต๋๋ค.
preferred font` ๋ฅผ ์ํฉ์ ๋ง์ถฐ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. preferred font๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์์ ์ค์ ์ ๊ธ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
Interface Builder์์ ์ฝ๊ฒ ์ค์ ํ ์ ์๊ณ ์ฝ๋๋ก๋ ํ ์ ์์ต๋๋ค.
์ฝ๋๋ก๋ UIFont
์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
static func preferredFont(forTextStlye: UIFonteTextStyle) -> UIFont
UIFontTextStyle
.headline
.body
.footnode
...
Custom Font ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
let font = UIFont(name: "Helvetica", size: 36.0)
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด size๊ฐ 36์ผ๋ก ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ณํ ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ด๋ metrics
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
let metrics = UIFontMetrics(forTextStyle: .body)
let fontToUse = metrics.scaledFont(for: font)
์ฃผ๋ก ๋ฒํผ ์ ๋ชฉ ๊ฐ์ ๊ณณ์๋ง ์ฌ์ฉ๋๋ ํฐํธ์ ๋๋ค.
static func systemFont(ofSize: CGSize) -> UIFont
static func boldSystemFont(ofSize: CGSize) -> UIFont
UIImageView
๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ฏธ์ง๋ UIImage
๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฌ์ฉํด์ค์ผ ํฉ๋๋ค.
Image๋ฅผ ์ป์ด์ค๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
Asset.xcasset
์ ์๋ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
let image: UIImage? = UIImage(name: "foo")
filesystem์ ์๋ ํ์ผ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ธํฐ๋ท์์ bit ๊ฐ๋ฐฉ์ธ Data ํ์ ์ ๋ฐ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
let image: UIImage? = UIImage(contentsOfFile: pathString)
let image: UIImage? = UIImage(data: aData)
UIGraphicsBeginImageContext(CGSize)
๋ฅผ ์ฌ์ฉํด Core Graphics๋ก ์ง์ ๊ทธ๋ด ์๋ ์์ต๋๋ค.
UIImage๋ฅผ ์ป์ด์๋ค๋ฉด ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ทธ๋ ค๋ผ ์ ์์ต๋๋ค.
let image: UIImage = ...
image.draw(at point: aCGPoint) // image๋ฅผ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ์ ๊ทธ๋ฆฝ๋๋ค.
image.draw(in rect: aCGRect) // rect์ ๋ง์ถฐ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
image.drawAsPattern(in rect: aCGRect) // rect์ ๋ง์ถฐ ์ด๋ฏธ์ง๋ฅผ ํ์ผ์ฒ๋ผ ๋ฐ๋ณต์ ์ผ๋ก ๊ทธ๋ ค๋
๋๋ค.
๋ํ์ ์ผ๋ก ๊ธฐ๊ธฐ๋ฅผ ํ์ ์์ผฐ์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๊ทธ๋ ค์ค ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง iOS์์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ค์ ๊ทธ๋ ค์ฃผ์ง ์์ต๋๋ค.
์ด๋ด ๋ UIView์ content mode ๋ฅผ ์ฌ์ฉํฉ๋๋ค. view๊ฐ ์ด๋ค ์ข ๋ฅ์ content๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๋ํ๋ ๋๋ค.
var contentMode: UIViewContentMode
3๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
- ๋นํธ ์ ์ง ์๋ก ๊ทธ๋ฆฌ์ง ์๊ณ ํฌ๊ธฐ๋ ์กฐ์ ํ์ง ์๊ณ ๋นํธ๋ง ์์ง์ ๋๋ค. ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. .left/.right/.top/.bottom/.topRight/...
- ๋นํธ ๋์ด๊ธฐ ๋นํธ๋ฅผ ๋์ด๊ฑฐ๋ ์ค์ฌ์ ์๋ก์ด ๊ณต๊ฐ์ ๋ง์ถฅ๋๋ค. ํ๋ฉด์ ๋น์จ์ ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. .sacleToFill / .scaleAspectFill / .scaleAspectFit // scaleToFil ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ต๋๋ค.
- ๋ค์ ๊ทธ๋ฆฌ๊ธฐ (redraw) ๊ฒฝ๊ณ๊ฐ ๋ฐ๋์์ ๋ draw(rect)๋ฅผ ํธ์ถํด์ ์๋ก ๋๋ก์ํฉ๋๋ค. draw(rect)๋ฅผ ํธ์ถํ์ ๋ ๊ฒฝ๊ณ์ ์์น๋ฅผ ์์์ ๊ฒฝ๊ณ์ ๋ง๊ฒ ๋๋ก์ํ ์ ์์ต๋๋ค.
bounds๊ฐ ๋ณํํ๋ฉด subviews๋ฅผ ์ฌ๋ฐฐ์นํด์ผ ํ ์ ์์ต๋๋ค.
subview๋ค์ Autolayout ์ ์ค์ ํด๋์ง ์์๋ค๋ฉด, layoutSubviews()
๋ฅผ ์ฌ์ฉํด ์๋์ผ๋ก ๋ ์ด์์์ ์ฌ๋ฐฐ์นํ ์ ์์ต๋๋ค.
์ฆ, layoutSubviews() ๋ subview์ autolayout์ด ์ ์ฉ๋์ด ์์ง ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
override func layoutSubviews() {
super.layoutSubviews()
}
์ด ํ๋กํ ์ฝ์ ์์๋ฐ์ผ๋ฉด var description: String
์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด์ ๊ฐ์ฒด์ description์ ๋ง๋ค์ด์ค ์ ์์ต๋๋ค.
struct PlayingCard: CustomStringConvertible {
var description: String { return "\(suit)\(rank)" }
var suit: Suit
var rank: Rank
...
}