앱 제목 : 오늘의 말씀 (첫 iOS 앱)
프로그래밍 언어 : Swift
개발 환경 : XCode, Story Board활용 기술 :
1. AutoLayout
2. UILabel
3. UIButton
4. MVC 패턴
5. swift 구조체github : https://github.com/heyksw/Swifting/tree/main/iOS앱%20만들기/오늘의%20말씀
최근, iOS 앱 개발을 위해 애플 개발자에 등록했습니다.
간단한 저의 첫 아이폰 앱을 만들어 보았습니다.
- 리프레쉬 버튼을 누를때마다 랜덤한 성경 말씀을 출력하는 앱
- 비판적 클론코딩이란
패스트 캠퍼스 강의의 "명언 생성기 앱" 을 클론 코딩하며 공부했습니다.
단순히 따라치는 것보다는, 능동적으로 생각하며 코드를 작성하는 것이 더 도움이 된다고 생각했습니다. 따라서 클론코딩하며 공부할 때는 반드시 나만의 생각이 들어간 코드를 넣어 비판적 클론 코딩을 하겠다고 생각했습니다.
- UIView 의 모서리를 직각이 아닌 둥글게 설정
- Button 을 클릭할때 색상이 살짝 바뀌었다가 돌아오도록 설정
- Custom font 를 적용
- cornerRadius
-> view에 layer.corner.Radius 에 접근하여 모서리를 얼마나 둥글게 변경할 것인지를 적용할 수 있다는 것을 따로 공부했습니다.
-> Button Touch Down, Touch Up Inside의 차이점에 대해서 공부했습니다.
- Font 변경 중 문제 해결
// 폰트 목록에 Gowun Batang 이 없으면 제대로 들어가지 않은 것 for family in UIFont.familyNames.sorted() { let names = UIFont.fontNames(forFamilyName: family) print("Family: \(family) Font names: \(names)") } // guard 문으로 폰트가 잘 추가 되었는지 에러 체크 guard let gowun = UIFont(name: "Gowun Batang", size: 18) else { print("Gowun Batang is not in UIFont") return } myTitle.font = gowun quoteLabel.font = gowun nameLabel.font = gowun
폰트를 다운받고 프로젝트 파일에 추가해줬지만, 폰트가 적용되지 않았습니다. developer.apple 사이트에서 참고하여, guard let 문으로 폰트가 제대로 추가가 된 것인지 확인했을 때 파일은 추가가 되었지만 프로젝트 내에 적용이 되지 않았다는 것을 알게 되었습니다.
Target Membership 에서 프로젝트를 체크해주고 프로젝트 내에 성공적으로 적용할 수 있었습니다.
- layer.cornerRadius
- .swift 파일에 구조체를 따로 생성하여 View Controller 에서 구조체를 불러와 사용할 수 있다.
- ViewController.swift
// // ViewController.swift // 오늘의 명언 // // Created by 김상우 on 2021/11/01. // import UIKit class ViewController: UIViewController { @IBOutlet weak var quoteLabel: UILabel! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var contentView: UIView! @IBOutlet weak var title2: UILabel! @IBOutlet weak var refreshButton: UIButton! let quotes = [ Quote(contents: "미련한 자라도 잠잠하면 지혜로운 자로 여기우고 입술을 닫히면 슬기로운 자로 여기우느니라", name: "잠언 17:28"), Quote(contents: "가난한 자를 무시하는 사람은 그를 지으신 하나님을 멸시하는 자이며 가난한 자를 불쌍히 여기는 자는 하나님을 존경하는 자이다.", name: "잠언 14:31"), Quote(contents: "비판을 받지 아니하려거든 비판하지 말라", name: "마태복음 7:1"), Quote(contents: "너는 초대를 받거든 오히려 맨 끝자리에 가서 앉아라. 그러면 너를 초대한 사람이 와서 '여보게 저 윗자리에 가서 앉게' 하고 말할 것이다.", name: "누가복음 14:10"), Quote(contents: "여호와는 나의 목자시니 내게 부족함이 없으리로다.", name: "시편 23:1"), Quote(contents: "무릇 자기를 높이는 자는 낮아지고 자기를 낮추는 자는 높아지리라.", name: "누가복음 14:11"), Quote(contents: "사람이 마음으로 자기의 길을 계획할지라도 그의 걸음을 인도하시는 이는 여호와시니라", name: "잠언 16:8"), Quote(contents: "죽고 사는 것이 혀의 권세에 달렸나니 혀를 쓰기를 좋아하는 자는 그 열매를 먹으리라", name: "잠언 18:21"), Quote(contents: "말이 많으면 허물을 면키 어려우나 그 입술을 제어하는 자는 지혜가 있느니라" , name: "잠언 10:19"), Quote(contents: "모든 지킬만한 것보다 네 마음을 지키라 생명의 근원이 이에서 남이니라", name: "잠언 4:23") ] override func viewDidLoad() { super.viewDidLoad() title2.text = "랜덤 성경 명언" contentView.layer.cornerRadius = 20 refreshButton.layer.cornerRadius = 10 //quoteLabel.text = "test" } var count = 0 @IBAction func tapQuoteGeneratorButton(_ sender: Any) { let random = Int(arc4random_uniform(8)) let quote = quotes[random] self.quoteLabel.text = quote.contents self.nameLabel.text = quote.name } }
- Quote.swift
// 말씀 구조체 선언 import Foundation struct Quote { // 말씀의 내용 let contents: String // 말씀이 어디 적혀 있는지 let name: String }