Skip to content

Instantly share code, notes, and snippets.

@alexpaul
Last active October 4, 2023 12:45
Show Gist options
  • Save alexpaul/76042d6577c7d01ee1695e11f7be9a33 to your computer and use it in GitHub Desktop.
Save alexpaul/76042d6577c7d01ee1695e11f7be9a33 to your computer and use it in GitHub Desktop.
ScrollView programmatically. UIScrollView.
import UIKit
final class DetailView: UIView {
// setting up a scroll view
// 1. add scrollview
// 2. add content view
// 3. add subviews to content view
// Note: must set high priority of content view to low, default is 1000
private lazy var scrollView: UIScrollView = {
let sv = UIScrollView()
return sv
}()
private lazy var contentView: UIView = {
let view = UIView()
return view
}()
public lazy var imageView: UIImageView = {
let iv = UIImageView()
iv.image = UIImage(systemName: "photo")
iv.clipsToBounds = true
return iv
}()
public lazy var descriptionLabel: UILabel = {
let label = UILabel()
label.numberOfLines = 0
label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
label.font = UIFont.preferredFont(forTextStyle: .title1) // title1, larger, title2 medium, title3 smaller
return label
}()
override init(frame: CGRect) {
super.init(frame: UIScreen.main.bounds)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
setupScrollViewContstraints()
setupContentViewConstraints()
setupItemImageViewConstraints()
setupDescriptionLabelConstraints()
}
private func setupScrollViewContstraints() {
addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: topAnchor),
scrollView.leadingAnchor.constraint(equalTo: leadingAnchor),
scrollView.bottomAnchor.constraint(equalTo: bottomAnchor),
scrollView.trailingAnchor.constraint(equalTo: trailingAnchor),
])
}
private func setupContentViewConstraints() {
scrollView.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
let heightConstraint = contentView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
heightConstraint.priority = UILayoutPriority(250)
NSLayoutConstraint.activate([
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor),
heightConstraint,
])
}
private func setupItemImageViewConstraints() {
contentView.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
imageView.heightAnchor.constraint(equalTo: safeAreaLayoutGuide.heightAnchor, multiplier: 0.50)
])
}
private func setupDescriptionLabelConstraints() {
contentView.addSubview(descriptionLabel)
descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
descriptionLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 20),
descriptionLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20),
descriptionLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20),
descriptionLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -20)
])
}
}
@yilmazedis
Copy link

Thanks, that is what I am looking.

@alexpaul
Copy link
Author

Glad it worked out for you 👍🏾

@dimebt
Copy link

dimebt commented Oct 4, 2023

Good example 👍
Duplicate constraint at line 73
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),

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