【发布时间】:2020-05-23 00:19:00
【问题描述】:
我有一个简单的 UIView 类,我希望将它添加到 UIScrollView。除了尝试设置视图属性之一(例如图像或某些文本)时,我已经能够将 UIView 作为数组添加到 UIScrollView 而没有任何问题,当我将 UIView 添加到UI滚动视图。我希望这是有道理的。代码如下:
对于 UIView 类:
import UIKit
class ScrollViewSlide: UIView {
lazy var mainImageForSubview : UIImageView = {
let mI = UIImageView()
mI.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
return mI
}()
lazy var mainLabel : UILabel = {
let mL = UILabel()
mL.frame = CGRect(x: 0, y: 0, width: 200, height: 30)
mL.center.x = center.x
mL.center.y = center.y
return mL
}()
//initWithFrame to init view from code
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupView() {
backgroundColor = .white
contentMode = .scaleAspectFit
addSubview(mainImageForSubview)
addSubview(mainLabel)
}
}
这是主要的 ViewController 代码:
import UIKit
import TinyConstraints
class ViewController: UIViewController, UIScrollViewDelegate {
// MARK: - Properties
lazy var contentViewSize = CGSize(width: self.view.frame.width * 3, height: self.view.frame.height * 0.6)
// MARK: - Views
lazy var pageIndicator : UIPageControl = {
let pI = UIPageControl()
pI.frame = CGRect()
return pI
}()
lazy var scrollView : UIScrollView = {
let view = UIScrollView(frame: .zero)
view.backgroundColor = .white
view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height * 0.6)
view.contentSize = contentViewSize
view.delegate = self
return view
}()
// MARK: - View Controller Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.backgroundColor = .white
view.addSubview(scrollView)
let mySlides = loadSlides()
setUpViewsForScrollView(slides: mySlides)
scrollView.isPagingEnabled = true
loadPageIndicator(mySlides)
}
func loadSlides() -> [UIView] {
let container1 = ScrollViewSlide()
container1.mainImageForSubview.image = UIImage(named: "cricket1")
container1.mainLabel.text = "Container1"
let container2 = ScrollViewSlide()
container2.mainImageForSubview.image = UIImage(named: "cricket2")
container2.mainLabel.text = "Container2"
let container3 = ScrollViewSlide()
container3.mainImageForSubview.image = UIImage(named: "crisp_ocean")
container3.mainLabel.text = "Container3"
return [container1, container2, container3]
}
func setUpViewsForScrollView(slides : [UIView]) {
for container in slides {
scrollView.addSubview(container)
}
}
func loadPageIndicator(_ mySlides : [UIView]) {
let myPageIndicator = pageIndicator
myPageIndicator.numberOfPages = mySlides.count
myPageIndicator.backgroundColor = .black
myPageIndicator.frame = CGRect(x: self.view.frame.width * 0.5, y: 500, width: 100, height: 30)
myPageIndicator.center.x = view.center.x
self.view.addSubview(myPageIndicator)
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
pageIndicator.currentPage = Int(pageIndex)
}
}
特别是当我在 loadSlides() 中设置属性时,它们不会转移到 UIScrollView。它只是空白,背景为白色。
有什么想法吗?
【问题讨论】:
-
您忘记为多个视图设置框架。我会强烈推荐两个选项:1) 使用
UIPageViewController——它几乎内置了所有这些(如果你最终使用内存管理) 很多张幻灯片),或2)了解约束和自动布局。这是何时使用堆栈视图将“幻灯片”子视图保存在滚动视图中的完美示例。 -
感谢@DonMag,我会研究这两个想法。问你一个问题,你会推荐
UIPageViewController而不是使用UIScrollView吗? -
我认为框架设置正确,因为我在 var 定义中定义它们,当我查看在 Debug View Hierarchy 中运行的应用程序时,框架和视图似乎尺寸正确。我错过了什么吗?
-
如果您有 3 张幻灯片(“页面”)?使用
UIScrollView可能更容易。如果你可能有 20 张幻灯片?然后是UIPageViewController或UICollectionView。如果幻灯片都是相同的(图像和标签),则集合视图可能会更好。如果幻灯片不同——特别是如果它们是交互式的——那么页面视图控制器。
标签: ios swift uiview properties uiscrollview