[iOS] UIScrollView 다루기 (storyboard / programatically)

nnnyeong·2021년 8월 10일
6

iOS

목록 보기
5/17
post-thumbnail

오랜만에 정리하는 iOS 포스팅은 스크롤뷰이다!
근무를 할 때 겪었던 여러가지 다양한 상황 중에서 또 기억에 남는게 있냐 하면 이 스크롤뷰를 만들었다 지웠다, 스토리보드로 했다가 코드로 했다가,,

워낙 기본중에 기본인데 처음엔 tableview, collectionview 보다 다루기가 좀 까다로웠다.

하지만 iOS 앱 개발에서 UIScrollView 는 필수적이니 이번 기회에 한번 두가지 방법으로 정리해 보려 한다!




UIScrollView

공식 문서엔 뭐라고 되어 있는가?


scrolling, zooming 할 수 있는 뷰~! 당연한 말~

조금만 더 읽어보면,

UIScrollView is the superclass of several UIKit classes, including UITableView and UITextView.
A scroll view is a view with an origin that’s adjustable over the content view. It clips the content to its frame, which generally (but not necessarily) coincides with that of the application’s main window. A scroll view tracks the movements of fingers, and adjusts the origin accordingly.

UIScrollView 는 우리에게 익숙한 UITableView, UITextView 등과 같은 여러 UIKit 클래스 들의 상위 클래스구나! (스크롤이 되니까 그러겠징?)

또 scroll view는 안에 들어가는 content view 에 맞게 origin 이 조정되고, scroll view 의 frame 에 들어오는 부분을 clip 하는구나!

실제로 storyboard 에서 UIScrollView를 생성하면 ContentLayoutFrameLayout 이라는 요소가 함께 존재하는데 이 두가지는 각각

  • ContentLayout = scroll view 안에 들어가는 모든 뷰들을을 담고 있는 영역에 대한 layout
  • FrameLayout = 실제로 scroll view 가 보여지게 되는 영역에 관한 layout

이라고 한다! 나 역시 이 두가지 요소의 개념을 알고 난 뒤 UIScrollView 를 좀 더 쉽게 다룰 수 있었다.




그럼 실제로 한번 만들어보자!

Programatically

예전엔 스토리보드밖에 몰랐는데 나름대로 개발을 하면 할수록 뭔가 없이 하는게 더 편하다 느낀다! 문제가 났을 때 바로 찾기도 쉽고 수정하기도 좋고, 무엇보다 스토리보드에 이것저것 올려서 버벅이는게 너무 무섭다,,,ㅎ

암튼 스토리 보드 없이 코드로만 스크롤뷰를 완성 해 보자!



먼저 당연히 UIScrollView 가 필요하다!

let scrollView : UIScrollView! = UIScrollView()

그리고 scrollview 에 들어갈 구체적인 contentView 가 필요하다! scrollview는 안에 들어가는 내용에 따라서 그 크기가 결정되어 스크롤되기 때문에 하얀 도화지를 한장 깔아주는 개념으로 contentView가 반드시 필요하다!

let contentView : UIView! = UIView()


이제 이 scrollviewcontentView 의 위치와 제약을 걸어주자.

scrollView.translatesAutoresizingMaskIntoConstraints = false
contentView.translatesAutoresizingMaskIntoConstraints = false

view.addSubview(scrollView)
scrollView.addSubview(contentView)

scrollviewcontentView 에 autolayout을 적용하기 위해 translatesAutoresizingMaskIntoConstraints 속성을 false 로 변경해주고 view에는 scrollview를, scrollview에는 contentView를 올려준다.



NSLayoutConstraint.activate([
	scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
	scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
	scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
	scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])

먼저 scrollview 를 화면의 safeArea에 딱 맞게 맞춰주고,



NSLayoutConstraint.activate([
	contentView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
	contentView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
	contentView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
	contentView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)
])

contentView 는 scrollView의 contentLayoutGuide 와 동일하게 잡아준다!
우리가 만드려는 contentView의 전체 높이는 scrollview 가 보여지는 영역보다 커질 수 있으므로 frameLayoutGuide 가 아닌 contentLayoutGuide 와 맞춰주자!



contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

let contentViewHeight = contentView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor)
contentViewHeight.priority = .defaultLow
contentViewHeight.isActive = true

이후 수직 스크롤을 적용하기 위해 contentView 와 scrollView의 width를 동일하게 잡아주고 height를 동일하게 잡아주되 priority 값을 조정하여 scroll 될 수 있도록 한다!



contentView.addSubview(movieTitle)
contentView.addSubview(movieImage)
contentView.addSubview(movieDescription)
        
NSLayoutConstraint.activate([
	movieTitle.centerXAnchor.constraint(equalTo: contentView.centerXAnchor),
	movieTitle.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 150),
            
	movieImage.centerXAnchor.constraint(equalTo: contentView.centerXAnchor),
 	movieImage.widthAnchor.constraint(equalToConstant: 300),
 	movieImage.heightAnchor.constraint(equalToConstant: 300),
    	movieImage.topAnchor.constraint(equalTo: movieTitle.bottomAnchor, constant: 40),
            
	movieDescription.topAnchor.constraint(equalTo: movieImage.bottomAnchor, constant: 40),
	movieDescription.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20),
	movieDescription.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20)
])

이후 contentView를 여러 요소로 채우면, 수직 스크롤 뷰가 제대로 작동하는걸 확인할 수 있다!




StoryBoard 이용하기

viewcontroller 위에 scrollView를 올리면 Content LayoutFrame Layout 이 함께 들어가 있는걸 볼 수 있다!

ScrollView를 화면에 꽉 차게 늘려주고, autolayout을 걸어준 뒤, 안에 들어갈 contentView를 넣어주자.

그럼 저렇게 빨간 것들이 나타나 마음을 불편하게 한다 ㅎ,,

일단 contentView 와 scrollView.contentLayoutGuide를 동일하게 맞춰준 뒤에

코드로 지정해줬던 것 처럼 contentView 와 scrollView의 width를 동일하게 맞춰 vertical scroll 이 작동하도록 해 주고,
contentView 와 scrollView의 height 제약을 건 후 priority 를 조정해 준다!

그럼 불편했던 빨간 것들이 사라진 것을 볼 수 있다!
이후에는 contentView 안에 원하는 내용물로 채워 scrollView 를 완성해 주면 된다!




매우 기본적인 내용이지만, 내가 잊지 않기 위해 복습겸 정리겸 작성해 보았다!




[iOS] UIScrollView 스토리보드에서 오토 레이아웃으로 구현하기
UIScrollView with AutoLayout, programmatically

profile
주니어 개발자까지 ☄️☄️

2개의 댓글

comment-user-thumbnail
2021년 10월 14일

찾아보니 결국은 코드만 사용해서 UI를 작성하는 방향으로 가는게 맞는 것 같은데 검색은 어떤 방법으로 해야하나요?? 필요한 기술을 보고 싶으면 앞에 storyboard나 swiftUI를 붙이면 되는데 코드로만 하는건 only code 이런식으로 검색하나요?

1개의 답글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN