Skip to content

Instantly share code, notes, and snippets.

@sketchytech
Last active January 29, 2019 20:15
Show Gist options
  • Save sketchytech/79dd3537795312fb091935c7806c1b74 to your computer and use it in GitHub Desktop.
Save sketchytech/79dd3537795312fb091935c7806c1b74 to your computer and use it in GitHub Desktop.
A stack view that scrolls (which is actually a subclass of UIScrollView)
class UIScrollingStackView:UIScrollView {
private let stack = UIStackView()
var spacing:CGFloat {
get {
return stack.spacing
}
set {
stack.spacing = newValue
}
}
var axis:UILayoutConstraintAxis {
get {
return stack.axis
}
set {
stack.axis = newValue
}
}
var arrangedSubviews:[UIView] {
return stack.arrangedSubviews
}
override init(frame: CGRect) {
super.init(frame: frame)
stack.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(stack)
stack.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true
stack.leadingAnchor.constraintEqualToAnchor(self.leadingAnchor).active = true
stack.trailingAnchor.constraintEqualToAnchor(self.trailingAnchor).active = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addArrangedSubview(view:UIView) {
stack.addArrangedSubview(view)
}
}
@sketchytech
Copy link
Author

Sample implementation:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let scrollingStackView = UIScrollingStackView()
        scrollingStackView.translatesAutoresizingMaskIntoConstraints  = false
        view.addSubview(scrollingStackView)


        scrollingStackView.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor).active = true
        scrollingStackView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
        scrollingStackView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true
        scrollingStackView.heightAnchor.constraintEqualToConstant(200).active = true

        scrollingStackView.pagingEnabled = true
        scrollingStackView.bounces = false
        scrollingStackView.showsHorizontalScrollIndicator = false
        scrollingStackView.showsVerticalScrollIndicator = false
        for _ in 0...10 {
            let img = UIImageView(image: UIImage(named: "yourImage.JPG"))
            scrollingStackView.addArrangedSubview(img)
        }
    }

}

@sketchytech
Copy link
Author

Swift 3

import UIKit

class UIScrollingStackView:UIScrollView {
    private let stack = UIStackView()
    var spacing:CGFloat {
        get {
            return stack.spacing
        }
        set {
            stack.spacing = newValue
        }
    }
    var axis:UILayoutConstraintAxis {
        get {
            return stack.axis
        }
        set {
            stack.axis = newValue
        }
    }
    var arrangedSubviews:[UIView] {
        return stack.arrangedSubviews
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        stack.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(stack)
        stack.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        stack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
        stack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    func addArrangedSubview(view:UIView) {
        stack.addArrangedSubview(view)
        
    }
}

@sketchytech
Copy link
Author

sketchytech commented Jan 29, 2019

Swift 4 implementation:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.let scrollingStackView = UIScrollingStackView()
    scrollingStackView.translatesAutoresizingMaskIntoConstraints  = false
    view.addSubview(scrollingStackView)
    
    
    scrollingStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    scrollingStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollingStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollingStackView.heightAnchor.constraint(equalToConstant: 200).isActive = true
    
    scrollingStackView.isPagingEnabled = true
    scrollingStackView.bounces = false
    scrollingStackView.showsHorizontalScrollIndicator = false
    scrollingStackView.showsVerticalScrollIndicator = false
    for _ in 0...10 {
        let img = UIImageView(image: UIImage(named: "yourImage.JPG"))
        scrollingStackView.addArrangedSubview(img)
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment