Scrollview со встроенным табличным представлением

Я создаю приложение iOS в swift с Xcode 6. Я пытаюсь встроить контроллер вида с табличным представлением в scrollview. Когда пользователь перетаскивается в представление таблицы, предполагается перемещать таблицу, а не прокрутку, в которую она встроена. Я сделал эту иллюстрацию, чтобы очистить мой взгляд и просмотреть иерархию диспетчера: Просмотр иерархии

Красная область - это область размера содержимого прокрутки.

Зеленые и синие области - это разные контроллеры представлений, встроенные в прокрутку.

Желтая область - это текстовое поле в синем контроллере.

Оранжевая область представляет собой табличный вид в синем контроллере.

Я включил пейджинг в scrollview, чтобы он привязывался к зеленому или синему контроллеру. Как я могу открыть представление таблицы в верхней части иерархии представлений, так что единственный способ прокрутки scrollview - перетащить текстовое поле.

import UIKit

class RootViewController: UIViewController, UIScrollViewDelegate {

var scrollView: UIScrollView!

var greenViewController: GreenViewController!
var blueViewController: BlueViewController!

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView = UIScrollView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
    scrollView.delegate = self
    scrollView.pagingEnabled = true

    self.greenViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Green View Controller") as! GreenViewController
    self.blueViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Blue View Controller") as! BlueViewController

    greenViewController.view.frame = CGRectMake(0, 0, view.bounds.width, view.bounds.height)
    blueViewController = CGRectMake(0, view.bounds.height, view.bounds.width, view.bounds.height)


    scrollView.addSubview(greenViewController.view)
    scrollView.addSubview(blueViewController.view)

    scrollView.contentSize = CGSizeMake(view.bounds.width, view.bounds.height*2)

    self.view.addSubview(scrollView)

}

Надеюсь, что я ясно выразился.

EDIT:

Я попытался изменить размер прокрутки, когда он прокручивается. Идея состояла в том, чтобы изменить высоту кадра, чтобы она соответствовала высоте текстового поля, когда она прокручивается полностью вниз. Но похоже, что он также изменяет видимую часть встроенных в scrollview:

    func scrollViewDidScroll(scrollView: UIScrollView) {

    if self.scrollView.contentOffset.y > textField.View.bounds.height {
        self.scrollView.frame.size.height = view.bounds.height - scrollView.contentOffset.y - textField.View.bounds.height
        println(self.scrollView.frame)
    }
}

Ответ 1

Хорошо, теперь может быть немного поздно, но все же я размещаю это как учебник! Это менее предпочтительный способ достичь этого. Лучше будет,

Использование контроллера табличного представления в качестве родительского представления, а затем использование ячеек прототипа в качестве статической ячейки (в 'n' числах согласно вашему требованию) в виде карты или для любого другого использования

Каждая используемая ячейка будет рассматриваться как раздел, и никакие прототипные ячейки не будут равны никаким разделам кода, как в фрагменте ниже

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 3
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 2 {
        return list.count
    }
    return 1
}

количество строк в случае секций 0 и 1 будет 1 как статическая часть В то время как количество строк в случае раздела 2 i.e динамическая часть будет равна счету списка.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell : CustomTableViewCell.swift = CustomTableViewCell.swift()
    switch indexPath.section {

        case 0:
            cell = tableView.dequeueReusableCellWithIdentifier("staticCell1", forIndexPath: indexPath) as! CustomTableViewCell
            break

        case 1:
            cell = tableView.dequeueReusableCellWithIdentifier("staticCell2", forIndexPath: indexPath) as! CustomTableViewCell
            break

        case 2:
            cell  = tableView.dequeueReusableCellWithIdentifier("dynamicCell", forIndexPath: indexPath) as! CustomTableViewCell
            break

        default:
            break
    }
    return cell;

}

и вот оно! Работа сделана! Party!

Я получил ссылку отсюда Смешивание статических и динамических разделов в виде сгруппированных таблиц?

Ответ 2

Я издевался над этим. Моя иерархия выглядит так:

ViewController UIView
...UIView (to act as a container view for all the scrollable content)
.......UIView (for the top content) - green
.......UIView (for the bottom content) - blue
............UILabel
............UITableView (with scrollable content - more rows than visible)

Я подключил @IBOutlets к UIScrollView (scrollView) и UIView (containerView) для прокручиваемой области.

в viewDidLoad Я добавил:

scrollView.contentSize = containerView.frame.size

Если я щелкнул где-нибудь вне tableView (верхняя область, область текста и т.д.), я прокручиваю scrollView. Если я попытаюсь выполнить прокрутку в представлении таблицы, прокрутки tableView (scrollView не работает).

Это то, чего вы пытались достичь?