Как использовать uiscrollview внутри статической ячейки uitableviews с UITableView.automaticDimension - PullRequest
1 голос
/ 23 марта 2019

Я создал слайдер, как описано здесь: 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.Использование этих ограничений для вида прокрутки

enter image description here

Срок эксплуатации контроллера:

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 и заполнять всю ширину.Но почему-то это не работает.

1 Ответ

0 голосов
/ 23 марта 2019

После перерыва я пришел к решению, на самом деле я не уверен, является ли оно решением или обходным путем.

Я добавил вычисляемое свойство

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.Это все еще не идеально (представление управления страницами отсутствует, теперь мы рассмотрим это), но высота ячейки пока кажется правильной.Кстати, в форме предупреждения первый пост также исчез.Как вы думаете, ребята, правильное решение или просто обходной путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...