Skip to content

Instantly share code, notes, and snippets.

@jayesh15111988
Created April 20, 2023 08:08
Show Gist options
  • Select an option

  • Save jayesh15111988/ba0c8e017773eb30c1ae59e46d573004 to your computer and use it in GitHub Desktop.

Select an option

Save jayesh15111988/ba0c8e017773eb30c1ae59e46d573004 to your computer and use it in GitHub Desktop.
A demo to show how to use scroll behavior with stack view and scroll view in Swift
//
// ScrollViewController.swift
// Test
//
// Created by Jayesh Kawli on 19/04/2023.
//
// custom scroll view stack view in Swift
import Foundation
import UIKit
class ScrollViewController : UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 1.
lazy var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 20
return stackView
}()
// 2.
lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.addSubview(stackView)
scrollView.showsHorizontalScrollIndicator = false
return scrollView
}()
override func viewDidLoad() {
super.viewDidLoad()
}
override func loadView() {
let view = UIView()
view.backgroundColor = .white
// 3.
view.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
//scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
// 4.
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
//stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
// 5.
for i in 0..<20 {
let circle = UIView(frame: .init(origin: .zero, size: .init(width: 50, height: 50)))
circle.translatesAutoresizingMaskIntoConstraints = false
//circle.translatesAutoresizingMaskIntoConstraints = false
circle.widthAnchor.constraint(equalToConstant: 50).isActive = true
circle.heightAnchor.constraint(equalToConstant: 50).isActive = true
circle.backgroundColor = .gray
circle.layer.cornerRadius = 24
stackView.addArrangedSubview(circle)
if i % 2 == 0 {
stackView.setCustomSpacing(40, after: circle)
}
if i == 19 {
//stackView.setCustomSpacing(100, after: circle)
}
}
let label = UILabel(frame: .zero)
label.translatesAutoresizingMaskIntoConstraints = false
label.numberOfLines = 0
label.text = "asdasdas\nadasdasd\nadasdasdas"
label.heightAnchor.constraint(greaterThanOrEqualToConstant: 0).isActive = true
stackView.setCustomSpacing(100, after: stackView.arrangedSubviews.last!)
stackView.addArrangedSubview(label)
self.view = view
}
}
/*
class MyViewController : UIViewController {
// 1.
lazy var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 20
return stackView
}()
// 2.
lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.addSubview(stackView)
scrollView.showsHorizontalScrollIndicator = false
return scrollView
}()
override func loadView() {
let view = UIView()
view.backgroundColor = .white
// 3.
view.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
scrollView.heightAnchor.constraint(equalToConstant: 50).isActive = true
// 4.
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true
// 5.
for _ in 0..<20 {
let circle = UIView()
circle.translatesAutoresizingMaskIntoConstraints = true
circle.widthAnchor.constraint(equalToConstant: 50).isActive = true
circle.heightAnchor.constraint(equalToConstant: 50).isActive = true
circle.backgroundColor = .gray
circle.layer.cornerRadius = 24
stackView.addArrangedSubview(circle)
}
self.view = view
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment