frame view와 content view를 가진다.
frame
contentSize
content size > frame size 인 경우 scroll이 가능하다.
frame, content size를 변경함으로써 가로, 세로 scroll을 생성할 수 있다.
UIKit
에서 UITableView
, UICollectionView
의 parent class이다.
UIScrollView
class의 기능을 상속받는다.보통 새로운 view(subview)를 content view에 연결시켜 content view를 관리한다.
content view 역할의 subview를 scroll view의 content area와 동일하도록 설정한다.
(Constant value 0
으로 설정)
content view 역할의 subview와 Frame Layout Guide를 control-dragging 하여, Equal Widths 설정
ex) 가로 scroll이 존재하지 않도록 설정
Constant: 0
, Multiplier: 1
로 설정하여 subview와 frame view의 너비를 동일하게 설정
ex) scroll view 내부에 image view가 존재하고 줌인, 줌아웃 시 이미지를 중심에 위치하고 싶을 경우
// image view의 중심을 scroll view의 content layout의 중심에 맞춘다.
imageView.centerXAnchor.constraints(equalTo: scrollView.contentLayoutGuide.centerXAnchor)
imageView.centerYAnchor.constraints(equalTo: scrollView.contentLayoutGuide.centerYAnchor)
contentInset
property)을 조절할 수 있다.scrollIndicatorInset
property를 통해 같은 방식으로 padding을 생성한다.@IBOutlet var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
registerForKeyboardNotifications()
}
func registerForKeyboardNotifications() {
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWasShown(_:)),
name: UIResponder.keyboardDidShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillBeHidden(_:)),
name: UIResponder.keyboardWillHideNotification,
object: nil
)
}
@objc func keyboardWasShown(_ notificiation: NSNotification) {
guard let info = notificiation.userInfo,
let keyboardFrameValue =
info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardFrameValue.cgRectValue
let keyboardSize = keyboardFrame.size
// 키보드의 길이만큼 content area의 padding을 더해 content를 위로 끌어 올린다.
// contentInset: scroll view content의 buffer area
let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0,
bottom: keyboardSize.height, right: 0.0)
scrollView.contentInset = contentInsets
// scroll indicator(스크롤 바)가 키보드에 가려지지 않도록 위로 끌어 올린다.
scrollView.scrollIndicatorInsets = contentInsets
}
@objc func keyboardWillBeHidden(_ notification:
NSNotification) {
let contentInsets = UIEdgeInsets.zero
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
}