Plot [์ค๊ฑฐ๋ฆฌ] ๋น์ ์ ๋ง๋จ์ด ๊ฐ์ฅ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง ์ ์๋๋ก, Plot์ ๋น์ ์ ์ํ ์ค๊ฑฐ๋ฆฌ๋ฅผ ์ค๋นํฉ๋๋ค.
๊ฐ๋ฐ ๊ธฐ๊ฐ: 2019.12.21 ~ 2020.01.03
iOS : chokyungjin , ujcheon
- Alamofire 4.7 [Connection Library]
- FloatRatingView 4 [Rating Library]
- Pageboy 3.2 [Top Tabbar]
- Lottie [JSON Animation IMG]
- Tabman 2.6 [Top Tabbar]
- Firebase/Database [FirebaseDatase]
- Firebase/Auth [FirebaseCRUD]
- Firebase/Storage [FirebaseDB]
- Firebase/Analytics [FirebaseDB]
- Firebase/RemoteConfig [FirebaseDB]
- SnapKit 5.0.0 [AutoLayout]
- TextFieldEffects [TextField]
- ObjectMapper 3.4 [JSON Package]
Function | Implemention | Etc , Part | Priority |
---|---|---|---|
SignIn / SignUp | โณ | Implementing ujcheon | 1 |
Rating | โญ๏ธ | Completed , chokyungjin | 2 |
Tabbar On Top | โญ๏ธ | Completed, chokyungjin | 1 |
GradientLayer | โญ๏ธ | Completed, chokyungjin | 2 |
MultiInteraction | โญ๏ธ | Completed, chokyungjin | 1 |
Firebase_Chatting | โญ๏ธ | Completed, chokyungjin | 1 |
Custom PopUp | โญ๏ธ | Completed , ujcheon | 1 |
Custom PickerView | โญ๏ธ | Completed, chokyungjin | 1 |
RadioButton , Photo Iibrary | โญ๏ธ | Completed , ujcheon | 1 |
CustomNavigationBar | โญ๏ธ | Completed, chokyungjin | 1 |
Thread Sleep | โญ๏ธ | Completed, chokyungjin | 1 |
IBCollection | โญ๏ธ | Completed, chokyungjin | 1 |
KeyboardConstraint | โญ๏ธ | Completed, chokyungjin | 1 |
SplashLaunScreen | โญ๏ธ | Completed, chokyungjin | 1 |
HashTag | โญ๏ธ | Canceled , ujcheon | 3 |
MyPageView | โญ๏ธ | Completed , ujcheon | 2 |
urlLinkOpen | โญ๏ธ | Completed, chokyungjin | 2 |
MatchingSuggestionView | โญ๏ธ | Completed, ujcheon | 2 |
ChattingWaitingView | โญ๏ธ | Completed, ujcheon | 2 |
PaySystem In App | โ | Canceled | 3 |
CustomStepper | โ | Canceled | 3 |
์ด๊ธฐ ํ ํ๋ฉด์ ํ
๋น ๋๋ฏธ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ , ํ์ฌ ์์์ ํน์ ๊ฐ๋ด ์์ ์์ผ๋ก ์ํ ์ ํ๊ณผ ์๊ฐ ์ ํ ๊ฒฐ์
๋งค์นญ ์๊ณ ๋ฆฌ์ฆ์ ํตํ ์ฑํ
ํํธ๋ ๊ฒฐ์
๋งค์นญ ์ ํ ํ์
, ์ฑํ
๋ทฐ
์๊ฐ ์์ ํ์ด์ง(Implementing)
๋งค์นญ ์ด๋ ฅ
-
Issue 1
- Git ์ ํตํ ํ์ ๊ฒฝํ์ ๋ถ์ฌ๋ก ์ธํ Branch ๊ฒฝํ ๋ถ์กฑ
- Master ์์์ Commit ์ ํผํ๊ณ Develop ๋ธ๋์น๋ฅผ ํ๋ ๋ ์์ฑํ์ฌ ์ถฉ๋ Handling
-
Issue 2
- ์ด๋ฏธ์ง๋ฅผ ์บ์ฌ๋ก ๋ฐ์ง์๊ณ ์ฌ์ฉํ ์ , ์ด๋ฏธ์ง ๋ฆฌ์์ค๋ฅผ ํต์ ํ ๋ Cache๋ฅผ ์ฌ์ฉํ์ง ์์.
OperationQueue().addOperation { let thumnailImage = self.getThumnailImage(withURL: movie.thumnailImageURL) DispatchQueue.main.async { cell.imageThumbnail.contentMode = .scaleAspectFill cell.imageThumbnail.image = thumnailImage } }
-
Issue 3
- ์ ์ฐํ AutoLayout Setting ๋ถ์กฑ.
- Scroll view ์ ์คํ ๋ ์ด์์์ ์ก๋๋ฐ view์ height ๋ฅผ ๊ณ ์ ํด์ผ ํ๋๋ฐ scroll view์ height ๋ฅผ ๊ณ ์ ํด์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ์๋ค. view์ height๋ฅผ ๊ณ ์ ํ๊ณ ๋ค์ด๊ฐ๋ image ์ ์คํ ๋ ์ด์์์ ์ฃผ๋ ํด๊ฒฐ.
-
Issue 4
- ์๋ฒ ํต์ ๊ฒฝํ ๋ถ์กฑ์ผ๋ก ์ธํ ์๋ชป๋ ๋ฐ์ดํฐ ์ ์ฅ , ์ด๋ฏธ์ง URL ๊ฐ์ ๊ฒฝ์ฐ์๋ KingFisher ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ธฐ๋ก ํจ.
func getMovieList(completion: @escaping (ListResponse?) -> Void) { guard let finalURL = URL(string: appUrl) else { return } let session = URLSession(configuration: .default) var request = URLRequest(url: finalURL) request.addValue("application/x-www-form-urlencoded" , forHTTPHeaderField: "Content-Type") request.httpMethod = "GET" let task = session.dataTask(with: request) { (data, response, error) in if let error = error { print(error.localizedDescription) return } guard let resultData = data else { return } do { let movieLists: ListResponse = try JSONDecoder().decode(ListResponse.self, from: resultData) self.dataManager.setMovieList(list: movieLists.results.randMovie) self.dataManager.setReserveMovieList(list: movieLists.results.reserveMovie) self.dataManager.setReserveDateList(list: movieLists.results.reserveDate) self.dataManager.setDidOrderTypeChangedAndDownloaded(true) self.reloadMovieLists() completion(movieLists) } catch let error { print(error.localizedDescription) } } task.resume() }
-
Issue 5
- UIPickerView 2๊ฐ๋ฅผ ํ ๋ทฐ์์ ์ฐ๋๋ฐ ํ๋์ Picker view์์ ์ ๋ ฅ๊ฐ์ด(titles.count) ๋ค๋ฅธ picker view์ ์ฎ๊ฒจ์ก๋ ๋ฌธ์ ์ ์ด ์์๊ณ func pickerView ๋ฅผ ๋๊ฐ๋ก ๋๋ด๋ ๊ฑธ ํ๊ฐ๋ก ํฉ์น๊ณ delegate๋ฅผ 2๊ฐ๋ฅผ ๋ง๋ค์ด์ ์จ์ ํด๊ฒฐ.
extension SignUpSecondVC: ToolbarPickerViewDelegate, ToolbarPickerViewDelegate2 {
func didTapDone() {
let row = self.pickerView.selectedRow(inComponent: 0)
self.pickerView.selectRow(row, inComponent: 0, animated: false)
self.minAgeField.text = self.titles[row]
self.minAgeField.resignFirstResponder()
}
func didTapDone2() {
let row = self.pickerView2.selectedRow(inComponent: 0)
self.pickerView2.selectRow(row, inComponent: 0, animated: false)
self.maxAgeField.text = self.titles[row]
self.maxAgeField.resignFirstResponder()
}
...
extension SignUpSecondVC: UIPickerViewDataSource, UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.titles.count
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.titles[row]
}
-
์กฐ๊ฒฝ์ง
์๋ ํ์ธ์!! Sopt 25๊ธฐ iOS ํํธ ์กฐ๊ฒฝ์ง์ ๋๋ค! ์ด๋ฒ ์ฑ์ผ์ผ๋ก ๋์ฑ ๋ ์ค๋ ฅ์ด ์์นํ๊ณ ๋ํ ์ผํ UX์ ๋ํด ๊ณ ๋ คํด๋ณด๋ ์๊ฐ์ด์์ต๋๋ค!
-
์ฒ์ ์
์๋ ํ์ธ์! Sopt 25๊ธฐ iOS ํํธ ์กฐ๊ฒฝ์ง์ ๋ ธ์ ์ฒ์ ์ ์ ๋๋ค! ์ ๋ ์ด๋ฒ ์ฑ์ผ์ ํตํด ๋ทฐ์ง๊ฐ์ ์ถ์ ๋คํ๊ณ ์ฝ๋ฉ์ ์ ์ผ๋ก ๊ฑฐ๋ญ๋ ์ค๋น๊ฐ ๋์์ต๋๋ค.
๐จโ๐ป Planner
- ์ ๊ฐ์ธ
- ๊น์๋น
๐ฉโ๐ป Designer
- ์ํ๋ฏผ
- ์ ํ๊ฐ
- ์กฐ์๋ฏผ
๐จโ๐ป Server
- ์ด์์ค
- ์ํฌ์ฐ
- ์ด๋คํ
- ์ด์ฌ์ฉ
๐ฉโ๐ป Android
- ํฉ์งํ
- ๊น๋ฏผ์ง
- ๊ฐ์๋น
- ๋ฐ๊ธธํ
๐จโ๐ป iOS ๐ป
- ์กฐ๊ฒฝ์ง
- ์ฒ์ ์
Please file issues to send feedback or report a bug. Thank you !