Hashable 프로토콜은 '정수형 해시값으로 자료형을 나타낼 수 있음' 정도의 의미를 가집니다. Swift의 기본 Collection 중 Set, Dictionary는 해시테이블로 구현이 되어있기에 Set의 아이템 Dictionary의 Key로 사용하고자 하는 자료형은 Hashable 프로토콜을 준수해야 합니다. 이외에 Hashable 프로토콜을 공부하면서 정리가 필요했던 몇 가지 부분을 글로 남깁니다. Hashable 프로토콜은 Swift 4.1 부터 Equatable, Comparable과 마찬가지로 synthesized implement가 생김(특정 조건을 만족한 상태에서 프로토콜을 채택할 경우 프로토콜을 자동으로 구현해주는 것) Hashable 프로토콜의 synthesized im..
UIScrollView? Content View? 스크롤 뷰는 스크롤 뷰 그 자체와, 콘텐츠 뷰가 있다. 스크롤 뷰는 콘텐츠를 들여다보는 프레임이고, 콘텐츠 뷰는 그 프레임이 돌아다닐 콘텐츠를 말한다. 그래서 스크롤 뷰는 커봤자 아이폰 화면크기만하고 콘텐츠 뷰는 엄~청 커질 수 있다. ScrollView, ContentView Auto Layout 설정 스크롤뷰 오토레이아웃은 다음과 같은 단계를 따르면 된다 스크롤 뷰를 씬에 추가하고, 일반 뷰처럼 constraint를 설정한다 스크롤 뷰 안에 View를 추가한다(이때 View의 이름을 Content View로 해두면 좋음) Content View의 top, bottom, leading, trailing을 스크롤뷰에 맞춘다. 이제 Content View는..

iOS에서 키보드가 올라오면, 뷰의 컨텐츠를 가리는 경우가 있다. 그래서 키보드의 높이에 따라서 뷰의 컨텐츠 위치를 재조정해줘야하는데, 이때 주로 사용하는 방법이 UIWindow.keyboardWillShowNotification 에 observer를 달고 notification의 userinfo 키로 UIResponder.keyboardFrameEndUserInfoKey 를 사용하여 키보드의 높이를 가져와서 뷰 컨텐츠의 높이를 재조정해준다. keyboardFrameEndUserInfoKey 는 별 게 아니고, UIResponder에 정의된 String 타입의 클래스 프로퍼티이다. 직접 코드를 타고 들어가보면 알 수 있다. 예시 코드 UIWindow.keyboardWillShowNotification 에..
Intrinsic content size란 자신의 content size에 따라서 결정되는 뷰 사이즈를 말한다. 뷰 내뷰의 컨텐츠에 따라서 자신의 사이즈를 잡는 label, button 등은 intrinsic content size가 있어서 자신의 height, width를 알고 있다. 그래서 좌상단에 top, leading constraint만 줘도 잘 붙는다. UIView는 위와 같은 조건의 constraint를 주면 width, height를 모르겠다고 뜬다. size inspector에서 Intrinsic size의 place holder를 만들어두면 임시로 크기를 정할 수 있는데, 이거는 인터페이스 빌더에서 임시로 적용되는 거고 런타임에는 적용되지 않는다. 그래서 UIView의 Intrinsic..

UICollectionView 를 사용하면서 사용자가 셀을 터치했을 때 간단한 애니메이션을 주고 싶었습니다. 그래서 여러 animate들을 적용해보던 중에 괜찮은 효과를 적용할 수 있어서 정리하였습니다. 적용한 코드 collectionView의 셀을 터치했을 때 사용자에게 터치 피드백을 주기위해서 사용하였다. CGAffineTransform(=아핀 변환)을 사용하여 셀의 크기를 살짝 줄였다 되돌렸고 이 때 스프링 효과를 주었다. 코드는 아래와 같다. func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) { if let cell = collectionView.cellForItem(at: ..
키보드를 내리고 싶을 때 두가지 방법이 있다. 키보드의 리턴키를 눌러서 끝내기 키보드의 리턴키를 누르면 textFieldShouldReturn(_:) 델리게이트 메소드가 호출된다. 이 메소드 내에서 textField.resignFirstResponder() 메소드를 호출하면 된다. func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } 화면 다른 곳을 터치시켜서 끝내기 UIViewController의 touchesBegan(_:, with:) 메소드를 오버라이드하고 내부에서 view.endEdting(_:) 메소드를 호출한다. override func touches..

결론: 화면 전환은 뷰가 메모리에 모두 로드 되고, viewDidLoad() 메소드의 호출이 완료돼야 일어난다. 뷰가 메모리에 로드되는 시점은 실제로 화면 전환을 하기 위해 present(_:animated:) 메소드를 호출하거나 세그웨이를 실행하는 등의 행위를 할 때(이때 뷰 컨트롤러가 뷰를 메모리에 로드한다)이고 그래서 viewDidLoad() 메소드도 이때 호출된다. 뷰 컨트롤러 사이에 값을 전달하는 걸 실습해보면서 viewDidLoad() 메소드를 오버라이딩해서 사용했는데 문득 이 메소드가 호출되는 시점이 정확히 언제인지가 궁금해졌다. instantiateViewController(withIdentifier:) 메소드를 호출하여 뷰 컨트롤러가 인스턴스화된 순간인지, 아니면 화면을 전환하는 그 순간..

출석하냥 - 온라인 녹화강의 출석현황 확인 출석하냥은 한양대학교 온라인 녹화강의의 출석현황을 쉽게 알 수 있도록 도와주는 앱입니다. 기존에는 블랙보드를 통해 수업 하나하나 클릭을 여러 번 해야했고 온라인 녹화강의의 출석현황을 확인하는 데에 느린 서비스로 시간이 몇십초씩 소요되었습니다. 안 그래도 코로나로 인해 늘어난 온라인 녹화강의인데 현황을 한눈에 파악하기 힘들다는 문제가 있었습니다. 출석하냥으로 그 귀찮음과 수고로음을 덜 수 있게 되었습니다. 최초 출시, 출석하냥 최초의 출석하냥은 MVP 모델로, 간단한 기능만이 있었습니다. 메인페이지인 출석확인 탭에서 오른쪽 하단의 + 버튼을 눌러 수업을 한번만 등록해두면 해당 수업의 온라인 녹화강의 출석현황을 한눈에 보여주는 기능이었습니다. 올라온 전체 온라인 녹..
로그인 없이 학번과 학수번호, 수업번호만 있으면 출석을 확인할 수 있다?! 🥳 처음 딱 한 번만 수업을 등록하면, 언제든 온라인 녹화강의의 출석확인을 할 수 있어요! (게다가 각 영상별 진도율까지...! 🤭) android: https://play.google.com/store/apps/details?id=com.sweethoneybee.ChulseokHanyang 출석하냥 - 한양대학교 출석체크(only for blackboard) - Google Play 앱 • 로그인 할 필요 없이, 학번, 수업번호, 학수번호만 있으면 출석을 확인할 수 있어요 • 한 번 수업을 등록해두면 끝! 삭제는 등록한 수업을 옆으로 살짝 밀어서 삭제! • 몇 개의 수업이 올라 play.google.com iOS: apps.ap..
- Total
- Today
- Yesterday
- dockerfile
- Swift
- 도커 이미지
- 도커
- 사이드 프로젝트
- docker
- QHD모니터
- 개인정보처리방침
- 암기빵
- ES6
- 앱출시
- 카카오인턴십
- ios
- 평면모니터
- iOS #코코아터치
- 제발태그그만
- React Native
- 왕국타이머
- tensorflow
- 데일리
- docker-compose
- 게이밍모니터
- 144hz모니터
- 소프트웨어마에스트로11기
- 코코아터치
- 한성모니터
- docker image
- 간단정리
- docker tag
- 출석하냥
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |