-
[CALayer] CAScrollLayer에 대해서 알아보자.앱등이에게 살충제를 뿌린다./iOS 2017. 6. 6. 23:46
<채영이>
예제에 사용된 앱 : https://itunes.apple.com/us/app/layer-player/id949768742?mt=8
예제에 사용된 소스 : https://github.com/scotteg/LayerPlayer
원문 : https://www.raywenderlich.com/90488/calayer-in-ios-with-swift-10-examples
CAScrollLayer는 스크롤가능한 Layer를 표현합니다. CAScrollLayer는 간단한 편이고, 사용자의 터치나 제스쳐에 다이렉트로 respond할 수 없습니다.
그렇다면 UIScrollView의 layer는 CAScrollLayer타입일까? 라는 의문이 생길 수 있는데요. 그건 아닙니다. UIScrollView는 CALayer의 bounds를 조정하는 방식으로 스크롤을 합니다.
그렇다면 CAScrollLayer로는 무엇을 할 수 있을까요?
스크롤방향을 Horizontal, Vertical으로 제어할 수 있고 코드로 스크롤을 작동시킬 수 있습니다.
위에서 말씀드렸듯, CAScrollLayer는 사용자의 액션/제스쳐에 다이렉트로 반응할 수 없고, 코드를 통해 스크롤을 합니다.
아래 예제를 보면 이해가 되실겁니다.
// In ScrollingView.swift import UIKit class ScrollingView: UIView { // 1 override class func layerClass() -> AnyClass { return CAScrollLayer.self } } // In CAScrollLayerViewController.swift import UIKit class CAScrollLayerViewController: UIViewController { @IBOutlet weak var scrollingView: ScrollingView! // 2 var scrollingViewLayer: CAScrollLayer { return scrollingView.layer as CAScrollLayer } override func viewDidLoad() { super.viewDidLoad() // 3 scrollingViewLayer.scrollMode = kCAScrollBoth } @IBAction func tapRecognized(sender: UITapGestureRecognizer) { // 4 var newPoint = CGPoint(x: 250, y: 250) UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: { [unowned self] in self.scrollingViewLayer.scrollToPoint(newPoint) }, completion: nil) } }
(ScrollingView는 UIImageView를 갖고 있고 UIImageView의 크기보다 큰 사진을 image로 갖습니다. 포스트 상단에서 예제에 사용된 코드를 다운받을 수 있습니다.)1. ScrollingView라는 UIView의 서브클래스를 선언했습니다. layerClass()메소드를 상속하기 위함입니다. 이 메소드를 오버라이드 하면 뷰가 생성될 때, layer객체가 개발자가 지정한 클래스로 생성됩니다. 참조링크
2. layer를 편하게 쓰기 위해서 computed property하나 만들어 줬습니다.
3. 스크롤을 vertical, horizontal 모두 가능하도록 설정했습니다.
4. 탭 제스쳐가 인식되면 코드를 통해서 CAScrollLayer의 contents를 스크롤해줍니다. 이제 UIImageView위에 손으로 탭을 해주면 아래 사진과 같이 CAScrollLayer가 스크롤됩니다.
그렇다면, UIScrollView와 CAScrollLayer 사이에서 어떤 선택을 해야할까요?
- 퍼포먼스가 좋길 원하고, 스크롤을 코드로만 하여도 상관이 없다면 CAScrollLayer를 사용해보세요.
- 앱 사용자가 직접 스크롤을 할 수 있어야 한다면 UIScrollView를 사용하는 것이 좋습니다.
- 매우 큰 이미지를 스크롤해야 한다면, CATiledLayer를 사용해보세요.
'앱등이에게 살충제를 뿌린다. > iOS' 카테고리의 다른 글
[iOS/APNS] Notification의 payload에는 무엇이 있을까? (0) 2017.06.09 [iOS] 푸쉬를 연속으로 발송하면 몇 개만 옵니다. APNS의 Queue에 대해 알아보자. (0) 2017.06.08 [CALayer] CALayer의 몇 가지 프로퍼티에 대해서 알아보자. (0) 2017.06.06 [CAShapeLayer] CAShapeLayer에 CAAnimation 추가하기 (1) 2017.05.25 [UICollectionView] UICollectionViewFlowLayout 그리고 UICollectionViewDelegateFlowLayout (0) 2017.04.14