0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UIScrollViewでヘッダー部を固定する

Last updated at Posted at 2024-11-13

やりたいこと

どうすれば良いか

UIScrollViewの子Viewに固定したいViewを配置し、ズームとスクロール時に座標を更新すれば解決!

コード


import UIKit

class ViewController: UIViewController {
    /// UIScrollView
    @IBOutlet weak var scrollView: UIScrollView! {
        didSet {
            scrollView.delegate = self
            scrollView.minimumZoomScale = 1.0
            scrollView.maximumZoomScale = 5.0
        }
    }
    /// UIScrollViewでズームさせるView
    @IBOutlet weak var zoomView: UIView!
    /// ヘッダーView
    @IBOutlet weak var headerView: UIView!
    
    // 座標を更新する
    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        // スクロールさせている位置にY座標を移動する
        headerView.frame.origin.y = scrollView.contentOffset.y / scrollView.zoomScale
    }
}

// MARK: UIScrollViewDelegate

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateHeaderViewOrigin(scrollView)
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        updateHeaderViewOrigin(scrollView)
    }
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        zoomView
    }
}

注意点

固定させるViewは必ず最前面に表示する
(スクロール時に後ろへいってしまうため、固定されている様にみえない)

応用

列のみを固定したい場合

列Viewを作成し、x座標を変更する

    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        firstColumn.frame.origin.x = scrollView.contentOffset.x / scrollView.zoomScale
    }

Excelのような枠固定したい場合

列View/行View/枠固定Viewを作成し、それぞれ座標を更新する

    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x / scrollView.zoomScale
        let y = scrollView.contentOffset.y / scrollView.zoomScale
        // 先頭行
        headerView.frame.origin.y = y
        // 先頭列
        firstColumnView.frame.origin.x = x
        // 固定枠
        frozenPaneView.frame.origin.x = x
        frozenPaneView.frame.origin.y = y
    }
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?