Подтвердить что ты не робот

Возможно ли иметь фиксированный заголовок uitableview при использовании разделов?

Этот вопрос не следует смешивать с этим здесь.. Это две разные вещи.

Существует хороший пример, как использовать заголовок UITableView на SO.

Все это прекрасно работает, и основной заголовок фиксируется сверху, пока стиль не установлен на plain.

Но если я использую sections, основной заголовок больше не прилипает к вершине и удаляется при прокрутке вниз.

В этом методе я возвращаю заголовок для каждого раздела.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

В этом методе я устанавливаю высоту для заголовка выше:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

В этом методе я устанавливаю заголовок реальной таблицы.

- (void)viewWillAppear:(BOOL)animated {
    ...
    self.recordTableView.tableHeaderView = headerView;
}

Возможно ли иметь фиксированный заголовок таблицы при использовании разделов? Каково альтернативное решение этого вопроса?

4b9b3361

Ответ 1

Существует не способ поддерживать заголовок tableView fixed, но полезный подход, когда вам нужен уникальный заголовок, можно использовать UIViewController вместо этого UITableViewController и установить заголовок (UIView) out из tableView.

Что-то вроде этого:

enter image description here

Ответ 2

Если вы хотите UITableViewController (статические ячейки/обработка клавиатуры) и иметь фиксированный заголовок, вы должны использовать Containment. Вы можете сделать это из раскадровки, настроив UIViewController с фиксированным заголовком, а затем с помощью Container View, чтобы внедрить UITableViewController.

Объект раскадровки для просмотра контейнера

После того, как у вас есть установленная настройка просмотра, вы щелкните правой кнопкой мыши перетаскивание из представления контейнера в контроллер просмотра, который вы хотите внедрить, - в этом случае UITableViewController.

введите описание изображения здесь

Вы можете получить доступ к содержащемуся контроллеру View (UITableViewController) из контроллера просмотра контейнеров и получить его, реализовав метод prepareForSegue:sender:.

Ответ 3

Это для Swift 3. Я использую UITableViewController.

Я объявила переменную в классе, например:

class ListController: UITableViewController {

    var headerView = UIView() // declared this as UIView just for reminder

    override func viewDidLoad() {
    ...
    }
}

Затем я скопировал представление, которое я создал в форме storyboard, с constraints, это внутри viewDidLoad.

class ListController: UITableViewController {

    var headerView = UIView() // declared this as UIView just for reminder

    override func viewDidLoad() {

        ...

        self.headerView = NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self.tableView.tableHeaderView!)) as! UIView

        // optional
        self.headerView.backgroundColor = UIColor.white
        self.headerView.layer.shadowColor = UIColor.lightGray.cgColor
        self.headerView.layer.shadowOpacity = 0.1
        self.headerView.layer.shadowRadius = 3
        self.headerView.layer.shadowOffset = CGSize(width: 0, height: self.headerView.layer.shadowRadius*2)

        // this is important
        // you need to reassign selectors to the buttons
        // 
        for views in self.headerView.subviews
        {
            let button = (views as? UIButton)

            if button != nil
            {
                if  (button?.titleLabel?.text == self.btHome.titleLabel?.text)
                {
                    button?.addTarget(self, action: #selector(btHomeAction), for: .touchUpInside)
                }
                else if (button?.titleLabel?.text == self.btEdit.titleLabel?.text)
                {
                    button?.addTarget(self, action: #selector(btEditAction), for: .touchUpInside)
                }

                continue
            }
        }

        self.tableView.tableHeaderView = nil // removes the exising header created in storyboard
        self.tableView.tableFooterView = UIView()
    }
}

Наконец, в пределах delegates:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return self.headerView
}

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return self.headerView.frame.height
}

Здесь - это пример вывода.

Поздно, но я надеюсь, что это поможет кому-то, ура!:)

Ответ 4

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

Ответ 5

Если вы хотите сохранить класс как UITableViewController, вы можете добавить свой заголовок в качестве подзаголовка в viewview viewview. Вам также придется нажать верхнюю вставку tableview вниз, чтобы ваш headerview не скрывал таблицу.

Вот пример кода, который можно разместить внутри вашего подкласса tableViewController (в этом примере предполагается, что ваш контроллер табличного обзора находится внутри контроллера навигации, поэтому он перемещает представление под панель навигации):

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.automaticallyAdjustsScrollViewInsets = NO;

}

-(void)addHeaderView{
    CGFloat yPosition = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height;
    mainHeaderView = [[UIView alloc] init];

    const CGFloat mainHeaderHeight = 44;
    [mainHeaderView setFrame:CGRectMake(0, yPosition, self.view.frame.size.width, mainHeaderHeight)];

    mainHeaderView.backgroundColor = [UIColor redColor];

    [self.tableView.superview addSubview:mainHeaderView];
    [self.tableView setContentInset:UIEdgeInsetsMake(yPosition + mainHeaderHeight, self.tableView.contentInset.left, self.tableView.contentInset.bottom, self.tableView.contentInset.right)];
 }