Skip to content

INTENRZ/iOS-Internz

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

💛 INTERNZ_iOS 🐥🐤

사회에 첫 발걸음을 내딛기 전 필수 요소라고 할 수 있는 인턴 경험, 어떻게 준비해야할 지 막막하다면?
인턴을 처음 준비하는 대학생에게, 인턴을 준비하지만 어려움을 겪고 있는 대학생에게, 인턴을 경험했거나 하고 있는 대학생에게
가장 먼저 생각나는 서비스가 되길 바라며 제안하게 되었습니다.


workflow

screenshots


🔥 WITH SOPT 25th iOS Project

  • 개발 기간 : 2019년 12월 21일 ~ 2020년 1월 3일

⚡️ 협업 규칙

  • 커밋 메세지는 영어로
  • 변수 명은 low camel 사용
  • 강제 옵셔널 금지
  • 각자 분담한 스토리보드 외에 건들기 금지
  • 커밋시 반드시 서로에게 알릴것

🌟 사용 라이브러리

  • pod 'Alamofire', '~> 4.8.2'
  • pod 'Kingfisher', '~> 4.10.1'
  • pod 'CHIPageControl', '~> 0.1.3'
  • pod 'Tabman', '~> 2.6'
  • pod 'FSCalendar'

📱 Xcode Version

  • 11.3



💻   기능 소개

기능 개발 여부 기타사항 담당
스플래쉬 주연
온보딩 어플 첫 실행 시 동작 은지
로그인 주연,은지
회원가입(기본정보) 이메일 중복 체크 ○ 은지
회원가입(관심직무 + 프로필 설정) 첫 번째 로그인 한 경우에만 지정 은지
프로필 설정 첫 번째 로그인 한 경우에만 지정 은지
홈(맞춤 공고) 회사 url 연결 은지
홈(추천 프로필) 상세 프로필 연결 은지
홈(오늘의 스토리) 상세 스토리뷰 연결 은지
공고 전체공고 / 지난 공고 순으로 정렬 은지
공고 추가 관심있는 공고를 캘린더 일정에 추가 은지
공고 필터 보고 싶은 직무를 필터에 따라 설정 은지
공고 캘린더 월별 공고 조회, 추가한 공고 리스트를 캘린더에 표시 은지
스토리 최신순 / 조회순 정렬 은지
카테고리 별 스토리 조회 인턴 / 대외활동 / 공모전 / 동아리 / 자격증 / 기타 에 따라 조회 은지
스토리 상세글 은지
스토리 댓글 댓글보기 + 댓글쓰기 은지
개인 프로필 정보: 회원가입시의 한 줄 소개 + 프로필 사진 + 관심 직무 주연
개인 프로필 쪽지 대화를 나눈 유저 리스트 주연, 은지
개인 프로필 쪽지 상세 내용 주연
개인 프로필 타임라인 조회 주연
개인 프로필 타임라인 추가 플러팅버튼을 통해 타임라인 추가 주연
타임라인 스토리 리스트 조회 주연, 은지
개인 프로필 스토리 추가 주연
개인 프로필 스토리 팔로우 리스트 주연, 은지



📌 screenshots

  1. splash


  1. onBoarding


  1. Login & Signup


  1. home tab : 추천 공고, 추천 프로필, 최신 스토리


  1. announcement tab
  • 전체 공고, 지난 공고 정렬 선택
  • 공고 필터 : 보고 싶은 직무 1개 선택, 필터에 따라 정렬
  • 공고 캘린더 : 관심 추가한 공고를 캘린더에 추가


  1. story tab
  • 스토리 최신순, 조회순 정렬
  • 탭 바 : 인턴, 대외활동, 공모전, 동아리, 자격증, 기타에 따른 스토리 조회
  • 스토리 상세글
  • 스토리 댓글



  1. profile tab
  • 개인 프로필 정보 조회
  • 개인 활동에 대한 타임라인 작성 및 조회
  • 개인 프로필 > 타임라인 > 각 타임라인에 대해 작성한 스토리 리스트 조회
  • 팔로잉 / 팔로워 조회
  • 쪽지 주고 받기





문제점과 해결 방법

  1. 서버에서 받아온 데이터가 decode 되지 않음
    -> ResponseString 수정 (https://app.quicktype.io 참고 )
    enum CodingKeys: String, CodingKey {
        case timelineIdx, userIdx, title
        case start_date = "start_date"
        case end_date = "end_date"
        case category
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        timelineIdx = (try? values.decode(Int.self, forKey: .timelineIdx)) ?? 0
        userIdx = (try? values.decode(Int.self, forKey: .userIdx)) ?? 0
        title  = (try? values.decode(String.self, forKey: .title)) ?? ""
        start_date = (try? values.decode(String.self, forKey: .start_date)) ?? ""
        end_date = (try? values.decode(String.self, forKey: .end_date)) ?? ""
        category = (try? values.decode(String.self, forKey: .category)) ?? ""
    }


  1. UIPicker + Tool Bar 생성 -> 코드로 작성
        // 1. 전체를 잡는 view 생성 + constraint 걸기
        self.picker.isHidden = false
        self.picker.frame = CGRect(x: 0, y: view.frame.height - 220, width: view.frame.width, height: 150)
        view.addSubview(self.picker)
        
        // 2. Tool Bar 에 들어갈 버튼 생성
        let btnDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.testfunc))
        
        // 3. UIPicker Toolbar 생성 + 속성 setting
        let barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: picker.frame.width, height: 44))
        
        barAccessory.barStyle = UIBarStyle.default
        barAccessory.isTranslucent = true
        barAccessory.items = [btnDone]
        
        picker.addSubview(barAccessory)
        
        
        // 4. UIPickerView 생성
        self.pickerView.frame = CGRect(x: 0, y: barAccessory.frame.height, width: view.frame.width, height: picker.frame.height - barAccessory.frame.height)
        
        self.pickerView.delegate = self
        self.pickerView.dataSource = self
        self.pickerView.backgroundColor = UIColor.whiteFour
        
        picker.addSubview(self.pickerView)


  1. CalendarView 를 기획에 맞게 커스텀 하기
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "ko_KR")
    formatter.dateFormat = "yyyy-MM-dd"
        
    let xmas = formatter.date(from: "2019-12-25")
    let sampledate = formatter.date(from: "2019-12-22")
        
    dates = [xmas!, sampledate!]
extension CalendarViewController: FSCalendarDataSource{
    func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
        
        if self.dates.contains(date){
            return 1
        }
        
        return 0
    }
}


  1. UITabBar 사용하기
       // Create bar
        let bar = TMBar.ButtonBar()
        bar.layout.transitionStyle = .snap
        
        // Customize button color
        bar.buttons.customize { (button) in
            button.tintColor = UIColor.brownishGreyTwo
            button.selectedTintColor = UIColor.marigold
        }
        
        bar.indicator.tintColor = UIColor.marigold
        
        addBar(bar, dataSource: self, at: .top)


  1. Navigation Bar Line Custom
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        shadowImageView?.isHidden = false
    }
    
    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
        
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }




👶 Contributor

iOS 개발 경험이 없어 시행착오를 많이 겪으며 성장하는 중입니다. 인턴즈 체고 주연이 체체고‼️😘

앱개발은 처음이라 능숙치 못했지만 좋은 팀원 덕분에 많이 성장할 수 있던 뜻깊은 시간이었습니다! 은자이 체체고 ❣️


About

iOS Power 🤘

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •