스크롤 코드에 따라 이미지 높이를 동적으로 변경합니다
실시 요건
스크롤 업데이트에 따라 화면 맨 위에 이미지 높이 설정
Section Header와 table HeaderView 사이에 공백을 유지하면서 스크롤 가능
위로 굴러가면 Section Header가 화면 맨 위에 멈춰요.
전체 완성 이미지
스크롤 업데이트에 따라 화면 맨 위에 이미지 높이 설정
기본적인 처방은 다음과 같다.
소스 코드
ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
private lazy var tableView: UITableView = {
let view = UITableView()
view.delegate = self
view.dataSource = self
view.contentInsetAdjustmentBehavior = .never
view.register(SectionHeaderView.self, forHeaderFooterViewReuseIdentifier: "SectionHeader")
view.register(ContentCell.self, forCellReuseIdentifier: "Cell")
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
makeConstraints()
}
private func makeConstraints() {
view.addAutoLayoutedSubview(tableView)
NSLayoutConstraint.activate(tableView.fillConstraintsWithTopSafeArea())
}
private func setupTableView() {
let headerView = StretchyTableHeaderView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: StretchyTableHeaderView.imageHeihgt))
self.tableView.tableHeaderView = headerView
let view = UIView()
view.backgroundColor = .orange
tableView.tableHeaderView?.addAutoLayoutedSubview(view)
NSLayoutConstraint.activate([
view.centerXAnchor.constraint(equalTo: tableView.tableHeaderView!.centerXAnchor),
view.widthAnchor.constraint(equalTo: tableView.tableHeaderView!.widthAnchor),
view.heightAnchor.constraint(equalToConstant: 30),
view.topAnchor.constraint(equalTo: tableView.tableHeaderView!.bottomAnchor)
])
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ContentCell else {
fatalError("Failed To get a CustomCell")
return UITableViewCell() }
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
1
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let sectionHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: "SectionHeader") as? SectionHeaderView
return sectionHeader
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let headerView = self.tableView.tableHeaderView as! StretchyTableHeaderView
headerView.scrollViewDidScroll(scrollView: scrollView)
}
}
StretchyTableHeaderView.swift
class StretchyTableHeaderView: UIView {
static let imageHeihgt = 328.3333333333333
private var imageViewHeight = NSLayoutConstraint()
private var imageViewBottom = NSLayoutConstraint()
private lazy var imageView: UIImageView = {
let view = UIImageView(image: UIImage(named: "headerImage"))
view.backgroundColor = .yellow
view.contentMode = .scaleAspectFill
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
setConstraints()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setConstraints() {
self.addAutoLayoutedSubview(imageView)
imageViewBottom = imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor)
imageViewHeight = imageView.heightAnchor.constraint(equalTo: self.heightAnchor)
NSLayoutConstraint.activate([
imageView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
imageViewBottom,
imageViewHeight,
])
}
func scrollViewDidScroll(scrollView: UIScrollView) {
let offsetY = -scrollView.contentOffset.y
imageView.clipsToBounds = offsetY <= 0
imageViewBottom.constant = offsetY >= 0 ? 0 : -offsetY/4.7
imageViewHeight.constant = max(offsetY, 0)
}
}
자세한 내용github: https://github.com/yuk1ch1/StretchyHeaderImageViewSample보태다
swift
+ imageViewBottom.constant = offsetY >= 0 ? 0 : -offsetY/4.7
- imageViewBottom.constant = offsetY >= 0 ? 0 : -offsetY/2
여기 원래는/2 베이스의 제약이 업데이트되었는데, 이후 추가적인 기능을 위해 조정한 결과는 4.7추가 대응: SectionHeader와tableHeaderView 사이에 공백 상태를 유지하고 스크롤 & SectionHeader가 화면 위에서 정지
추가 요건은 다음과 같다.
해결책
위 코드에 따라 공간을 채우는 UIView를 만들고 addSubview를 Section Header에 추가했습니다
패하다
TableView style을 grouped로 만들면 공간이 사라져요
그냥 위로 굴러가면 Section Header가 화면 위에서 계속 사라져요.
참고 자료
Reference
이 문제에 관하여(스크롤 코드에 따라 이미지 높이를 동적으로 변경합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yukichi_tech/articles/c7754c04a3a4bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)