Я создал слайдер, как описано здесь: https://medium.com/@anitaa_1990/create-a-horizontal-paging-uiscrollview-with-uipagecontrol-swift-4-xcode-9-a3dddc845e92
Используя Xcode 10.1, Swift 4.2.1
У меня есть дополнительный вид интерфейса пользователя, как в учебнике, только состоящий из uiimageview
с 4 ограничениями:
- нижняя область безопасной области = нижняя часть просмотра изображения
- верхняя часть просмотра изображения = верхняя часть безопасной области
- центр просмотра изображенияx= superviews centerx
- ширина просмотра изображения = ширина superviews
Так что его пользовательский класс просто:
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
и заполнять всю ширину.Но почему-то это не работает.