똑똑한 집사들을 위한 기록장 Ounce.
고양이들은 입맛이 까다로워, 집사들은 성공확률이 높은 시도를 위해 먹여본 캣푸드를 따로 기록하고 있습니다. 저희는 이러한 집사들의 고민을 해결하기 위해 직관적인 기록, 서로의 목록 공유, 입맛이 비슷한 고양이 추천 기능을 제공하고 있습니다.
기록부터 선택까지, 온스가 함께합니다.
-
Xcode 11.5
-
iOS 13.0
-
Swift 5
라이브러리 | 목적 |
---|---|
Alamofire | 서버 통신 |
Gedatsu | 오토레이아웃 에러 디버깅 검출 |
Kingfisher | 이미지 처리 |
SnapKit | 코드 레이아웃 작성 |
SwiftKeychainWrapper | 저장소 암호화를 위해서 |
Then | 컴포넌트 코드 작성의 용이를 위해 |
YPImagePicker | 사진첩 사용 |
UPCarouselFlowLayout | Carousel effect |
iOSDropDown | DropDown 효과 |
CHIPageControl | 인디케이터 |
SwiftGifOrigin | GIF 이미지 사용 |
기능 | 상세 기능 | 담당 | 구현 여부 |
---|---|---|---|
스플래시 | 스플래시 | 준현 | O |
로그인 | 로그인 | 준현 | O |
회원가입 | 이메일 인증 | 준현 | O |
아이디 검증 | 준현 | O | |
비밀번호 검증 | 준현 | O | |
회원가입 | 준현 | O | |
프로필 등록 | 프로필 등록 | 준현 | O |
홈 화면 | 정렬 | 주연 | O |
필터 | 주연 | O | |
계정 선택 | 주연 | O | |
계정 추가 | 주연 | O | |
팔로워 | 호세 | O | |
팔로잉 | 호세 | O | |
설정 | - | O | |
프로필 수정 | - | O | |
설정 | 설정 메뉴 내부에서 로그아웃 | 주연 | O |
기록하기 | 기록 하기 | 윤진 | O |
제품 검색 | 윤진 | O | |
제품이 없을시 제품 생성과 함께 기록 | 윤진 | O | |
제품 | 제품 검색 | 준현 | O |
둘러보기 | 둘러보기 카드 뷰 | 호세 | O |
리뷰 추가 | 리뷰 추가 | 준현 | O |
김호세
let labelName = UILabel().then { $0.textColor = .black $0.backgroundColor = .white $0.textAlignment = .center $0.font = UIFont.systemFont(ofSize: 13) $0.text = "가을이" } // Then을 이용해서, 라벨을 생성하고 가독성을 위해서 BrowseCvCell의 extension BrowseCVCell + constranint 을 만들었습니다. 그 후에 func initial() { // Snapkit을 이용하여 programmatically autolayout을 설정 해주었습니다. contentView.addSubview(labelName) //contentView 안에 그려주고 labelName.snp.makeConstraints { (make) in make.leading.equalTo(contentView.snp.leading).inset(88) // label의 leading을 contentView의 leading에 constraint를 걸었습니다. make.trailing.equalTo(contentView.snp.trailing).inset(87) // label의 trailing을 contentView의 trailing에 constraint를 걸었습니다. make.top.equalTo(imgCatView.snp.bottom).inset(-10) // label의 top을 그 label 위에 있는 컴포넌트 (imgCatView)의 bottom에 걸었습니다. 기준이 bottom 이므로 Inset 값을 음수로 설정하였습니다. } }
박주연
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 1{
return 49
}
else {
return 0
}
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 1 {
let headerCell = reviewTV.dequeueReusableCell(withIdentifier: "HeaderCell")
return headerCell
}
else{
let rect = CGRect(x: 0, y: 0, width: 0, height: 0)
let myView = UIView(frame: rect)
return myView
}
}
이윤진
let custom = Bundle.main.loadNibNamed("PostSC", owner: self, options: nil)?[0] as! PostSC self.addScrollView.addSubview(custom)
오준현
먼저 커스텀 탭바를 구현해줄 클래스가 필요해 만들어줍니다.
weak var addDelegate: RootTabBarDelegate? private lazy var addButton:UIButton = { return UIButton() }() override init(frame: CGRect) { super.init(frame: frame) UITabBar.clearShadow() addButton.setBackgroundImage(UIImage.init(named: "btnAdd"), for: .normal) addButton.addTarget(self, action: #selector(CustomTabBar.addButtonClick), for: .touchUpInside) self.addSubview(addButton) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc func addButtonClick(){ if addDelegate != nil{ addDelegate?.addClick() } } override func layoutSubviews() { super.layoutSubviews() let buttonX = self.frame.size.width/3 var index = 0 for barButton in self.subviews{ if barButton.isKind(of: NSClassFromString("UITabBarButton")!){ if index == 1{ /// Setting the Add Button Position addButton.frame.size = CGSize.init(width: (addButton.currentBackgroundImage?.size.width)!, height: (addButton.currentBackgroundImage?.size.height)!) addButton.center = CGPoint.init(x: self.center.x, y: self.frame.size.height/2 - 18) index += 1 } barButton.frame = CGRect.init(x: buttonX * CGFloat(index), y: 0, width: buttonX, height: self.frame.size.height) index += 1 } } self.bringSubviewToFront(addButton) } /// Rewrite the hitTest method, listen for the button click to make the highlighted tabbar part respond to the click override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { /// Determine whether it is the root controller if self.isHidden { /// tabbar hiding is not handled in the home page system return super.hitTest(point, with: event) }else{ /// Converting Money Touch Points to Buttons to Generate New Points let onButton = self.convert(point, to: self.addButton) /// Determine whether the new point is on the button if self.addButton.point(inside: onButton, with: event){ return addButton }else{ /// No System Processing on the Button return super.hitTest(point, with: event) } } }여기서 주입해줄 Delegate 패턴을 만들어줍니다
protocol RootTabBarDelegate:NSObjectProtocol { func addClick() }그리고 마지막으로 탭바 컨트롤러에서 Delegate를 주입받고
extension TBC : RootTabBarDelegate{ }override func viewDidLoad() { super.viewDidLoad() let tab = CustomTabBar() tab.addDelegate = self self.setValue(tab, forKey: "tabBar") }addClick 즉 커스텀 할때 가운데에 들어갈 버튼을 클릭할때 실행될 코드를 작성해주시면 됩니다,
func addClick() { let sb = UIStoryboard(name: "Post", bundle: nil) let vc = sb.instantiateViewController(withIdentifier: "PostNavVC") as! PostNavVC vc.modalPresentationStyle = .fullScreen self.present(vc, animated: true) }
김호세 / (사원)
성장
팀원들이 너무 좋아서 행복했다. 어렵지만 성장 할 수 있었던 즐거운 3주였다.
박주연 / (차장. 사실 회장딸)
앱스토어 출시 & 협업 능력 성장
우리 온스 영원하자❤️ 앱스토어 등록 고고~~
이윤진 / (대리)
iOS 실력 성장 & 앱스토어 출시
온스 사랑해요❤️ 다들 3주동안 고생많았어요
오준현 / (부장)
앱스토어 출시
우리 사원들과 함께 즐거운 3주를 보낼 수 있어서 아주 즐거운 시간이었습니다.