gpt4 book ai didi

ios - 如何在带有 UITableView.automaticDimension 的 uitableviews 静态单元格中使用 uiscrollview

转载 作者:行者123 更新时间:2023-11-28 07:29:31 25 4
gpt4 key购买 nike

我创建了一个 slider ,如下所述:https://medium.com/@anitaa_1990/create-a-horizontal-paging-uiscrollview-with-uipagecontrol-swift-4-xcode-9-a3dddc845e92

使用 Xcode 10.1、Swift 4.2.1

我有一个额外的用户界面 View ,就像在教程中一样,它只包含一个带有 4 个约束的 uiimageview:

  • 安全区域底部 = 图片 View 底部
  • ImageView 顶部 = 安全区域顶部
  • image view centerx = superviews centerx
  • ImageView 宽度 = super View 宽度

所以它的自定义类就是:

class ImageSlide: UIView {

@IBOutlet weak var mainImageView: UIImageView!
}

我有一个带有 Tableview Controller 的 Storyboard。 TableView 的内容设置为 Static cells with automaticDimension。将此约束用于 ScrollView

enter image description here

Controller 生命周期:

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 进行测试。在第 3 代 12.9 英寸 iPad pro 上运行它,给我一个高度约为 40 或 50 的单元格。第一张幻灯片在整个宽度上拉伸(stretch),第二张幻灯片非常小以适应高度(这是预期的)远远因为 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

我在表格 View 中确实有一些空单元格,不知道警告是因为它们还是因为 slider 。当我旋转设备时,对于给定的幻灯片,看起来我确实有 300.0 的高度,但是单元格要大得多(填满整个屏幕)。

我不明白为什么一开始单元格高度在 40 或 50 左右,并带有警告消息。为什么单元格没有自动适应指定的高度300?例如,我想说的是, slider 应该始终具有例如高度。 view.frame.height/3。细胞也应该如此。我放入 slider 的图像应遵守 scaleAscpectFill 并填充整个宽度。但不知何故,它不起作用。

最佳答案

休息后我想出了一个解决方案,实际上我不确定它是一个解决方案还是一个变通办法。

我添加了一个计算属性

var sliderHeight: CGFloat! {
get {
return view.frame.width/2
}
}

改变了

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0, indexPath.row == 0 {
return sliderHeight
}
return UITableView.automaticDimension
}

分别更改了 setupSlideScrollView 方法,不使用 300.0 的硬编码高度,而是使用 sliderHeight。它仍然不完美(缺少页面控件 View ,现在将看一下)但单元格的高度到目前为止似乎是正确的。顺便说一句,第一个帖子的警告表格也消失了。伙计们,你们怎么看,是一个合适的解决方案还是一个变通办法?

关于ios - 如何在带有 UITableView.automaticDimension 的 uitableviews 静态单元格中使用 uiscrollview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55313378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com