【发布时间】:2019-08-14 06:03:56
【问题描述】:
我创建了一个滑块,如下所述:https://medium.com/@anitaa_1990/create-a-horizontal-paging-uiscrollview-with-uipagecontrol-swift-4-xcode-9-a3dddc845e92
使用 Xcode 10.1、Swift 4.2.1
我有一个额外的用户界面视图,就像教程中一样,只包含一个带有 4 个约束的 uiimageview:
- 安全区域底部 = 图像视图底部
- 图像视图顶部 = 安全区域顶部
- 图像视图中心x = 超级视图中心x
- 图像视图宽度 = 超级视图宽度
所以它的自定义类就是:
class ImageSlide: UIView {
@IBOutlet weak var mainImageView: UIImageView!
}
我有一个带有 Tableview 控制器的故事板。表视图的内容设置为Static cells 和automaticDimension。
将此约束用于滚动视图
控制器生命周期:
override func viewDidLoad() {
...
self.tableView.rowHeight = UITableView.automaticDimension
self.tableView.estimatedRowHeight = 40.0
...
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setupSlideScrollView(with: slides)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
setupSlideScrollView(with: slides)
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// time consuming (pictures fetched over the network)
slides = createSlides()
setupSlideScrollView(with: slides)
}
private func createSlides() -> [ImageSlide] {
// slides will be fetched over the network
// testing the scaleAspects
...
slide1.mainImageView.image = ...
slide1.mainImageView.contentMode = .scaleAspectFill
slide2.mainImageView.image = ...
slide2.mainImageView.contentMode = .scaleAspectFit
return [slide1, slide2]
}
private func setupSlideScrollView(with slides: [ImageSlide]?) {
sliderScrollView.contentSize = CGSize(width: view.frame.width * CGFloat(slides?.count ?? 1), height: 300.0)
sliderScrollView.frame.size = CGSize(width: view.frame.width, height: 300.0)
if let imageSlides = slides {
for i in 0..<imageSlides.count {
imageSlides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: 300.0)
sliderScrollView.addSubview(imageSlides[i])
}
print("scroll view frame height: \(sliderScrollView.frame.height)")
print("scroll view contentsize height: \(sliderScrollView.contentSize.height)")
print("slides[0] frame height: \(imageSlides[0].frame.height)")
}
}
我正在使用硬编码高度值300.0 进行测试。在 iPad pro 12.9 英寸第 3 代上运行它,给了我一个高度约为 40 或 50 的单元格。第一张幻灯片被拉伸到整个宽度,第二张幻灯片非常小,适合高度(预计如此远因为 scaleAspectFill/scaleAspectFit)。
日志显示:
[Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
scroll view frame height: 300.0
scroll view contentsize height: 300.0
slides[0] frame height: 300.0
scroll view frame height: 300.0
scroll view contentsize height: 300.0
slides[0] frame height: 300.0
我确实在表格视图中有一些空单元格,不知道警告是因为它们还是因为滑块。
当我旋转设备时,对于给定的幻灯片,看起来我确实有 300.0 的高度,但单元格要大得多(填满整个屏幕)。
我不明白为什么一开始单元格高度约为 40 或 50,并带有警告消息。为什么单元格不自动适应指定的高度 300?
例如,我想说,滑块的高度应始终为例如view.frame.height/3。细胞也应该如此。我放入滑块的图像应该尊重scaleAscpectFill 并填充整个宽度。但不知何故,它不起作用。
【问题讨论】:
标签: ios swift xcode uitableview uiscrollview