Stacking Fire
회사 앱에 사용하기 위해 간단한 커스텀 인디케이터를 만들어 보았습니다. 결과물 환경 iOS 9.0 + Swift 4.0 SnapKit 개요 UIScrollViewdelegate의 scrollViewDidScroll(_:)을 이용하면, 스크롤되는 도중의 모든 contentOffset을 감시할 수 있습니다. 그 모든 타이밍에 페이지 인디케이터를 업데이트해주면, 나머지는 알아서 애니메이션처럼 보입니다. (이미 충분히 세부적인 contentOffset의 변화를 캐치할 수 있기 때문에, 애니메이션 함수는 필요가 없습니다.) Code scrollViewDidScroll(_:) 현재의 포지션을 전체 페이지 대비해서 계산합니다. 예를 들어 0.7라는 숫자는 0번 뷰에서 1번 뷰까지 70% 스크롤된 상태란 뜻입니다. (..
iOS는 매년 새로운 API를 출시하는가 하면, 예전에 있던 API를 제거하기도 합니다. 하지만 상용 앱을 만드는 입장에서 타겟은 늘 정해져 있죠. iOS의 장점 중 하나가 프래그멘테이션 최소화를 통해 강력한 새 기능들을 최대한 많은 사람들에게 제공한다는 데 있기 때문에, 새 기능을 도입하는 것은 필수적입니다. 그러면서 하위호환도 생각해주기 위해, #available을 이용해서 분기 처리를 해 줍니다. 사용 방법 if #available(iOS 10.0, *) { // iOS 10.0 이상이라면 이런 행동을 해라 } else { // 아니면 이런 행동을 해라. } *의 의미 원래 플랫폼 여러 개에 대해서 예외처리를 해주는 코드이기 때문에, 아래처럼 다른 플랫폼을 추가해 줄 수 있습니다. 마지막의 *는, ..
UIView에는 animate(withDuration:animations:completion:)라는 애니메이션 메서드가 있습니다. 프레임(frame) 베이스의 앱에서는 아주 직관적이고 편리한 메서드입니다. 하지만 오토 레이아웃을 쓰게 되면 좀 혼란스러워지죠. 프레임처럼 단순히 값만 바꿔주는 걸로는 작동하지 않습니다. 애초에 프레임 값의 변화를 캐치해서 애니메이션으로 만들어 주는 메서드이기 때문입니다. 찾아보면 슈퍼뷰(superview)에 layoutIfNeeded()를 사용하면 된다고 하는데, 모든 서브뷰를 다시 레이아웃하는 메서드인 만큼 부작용이 따를 수 있습니다. 게다가 뷰의 레이아웃 뿐만 아니라 컬러라든가 컨텐츠 등을 업데이트하는 것도 같은 타이밍에 애니메이션되어야 한다면 머리가 좀 아파집니다. 관..