Как добавить UIView над текущим UITableViewController - PullRequest
55 голосов
/ 10 января 2011

У меня возникают трудности при добавлении подпредставления (UIView) из метода viewDidLoad UITableViewController

Это работает:

[self.view addSubview:self.progView];

Но вы можете видеть, как линии ячеек таблицы отбираются через UIViewprogView.

Я пробовал этот подход:

[self.view.superview insertSubview:self.progView aboveSubview:self.view];

Это попытка добавить progView, UIView к суперпредставлению, поверх текущего представления.Когда я пытаюсь это сделать, UIView никогда не появляется.

- ОБНОВЛЕНИЕ -

Ниже приводится последняя попытка:

UIView *myProgView = (UIView *)self.progView; //progView is a method that returns a UIView

[self.tableView insertSubview:myProgView aboveSubview:self.tableView]; 
[self.tableView bringSubviewToFront:myProgView];

Результат совпадает с [self.view addSubview: self.progView];UIView появляется, но, похоже, за столом.

Ответы [ 19 ]

2 голосов
/ 02 сентября 2016

Решение для Swift (эквивалент Даниэля Саиди):

Если ваш контроллер является UITableViewController в раскадровке или XIB и вы хотите переназначить self.view для стандартного UIView при сохранении существующего представления таблицы:

@IBOutlet var tableViewReference: UITableView!
var viewReference: UIView!

Тогда в вашем файле реализации:

Добавьте эти переменные экземпляра в файл контроллера табличного представления:

override var tableView: UITableView! {
    get { return tableViewReference }
    set { super.tableView = newValue }
}

override var view: UIView! {
    get { return viewReference }
    set { super.view = newValue }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.edgesForExtendedLayout = UIRectEdge.None
    self.extendedLayoutIncludesOpaqueBars = false
    self.automaticallyAdjustsScrollViewInsets = false

    //rewiring views due to add tableView as subview to superview
    viewReference = UIView.init(frame: tableViewReference.frame)
    viewReference.backgroundColor = tableViewReference.backgroundColor
    viewReference.autoresizingMask = tableViewReference.autoresizingMask
    viewReference.addSubview(tableViewReference)
}

В вашем файле раскадровки или XIB: подключите tableView в UITableViewController к переменной tableViewReference.

Тогда вы сможете добавить дочерние представления следующим образом:

self.view.addSubView(someView)
2 голосов
/ 03 ноября 2017

Обновление для iOS 11:

Теперь можно добавить подпредставление к UITableView при использовании ограничений AutoLayout в безопасной области.Эти представления не будут прокручиваться вдоль TableView.

В этом примере представление располагается под панелью навигации над UITableView элемента UITableViewController

[self.tableView addSubview:self.topBarView];
[NSLayoutConstraint activateConstraints:@[
    [self.topBarView.topAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.topAnchor],
    [self.topBarView.leadingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.leadingAnchor],
    [self.topBarView.trailingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.trailingAnchor],
    [self.topBarView.heightAnchor constraintEqualToConstant:40.0]
]];
.
1 голос
/ 03 августа 2016

Вы можете просто поместить следующий код в viewDidAppear:

[self.tableView.superview addSubview:<your header view>];
1 голос
/ 25 февраля 2019

Swift 4

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

class MyTableViewController: UITableViewController {

    var strongTableView: UITableView?

    override var tableView: UITableView! {
        get {
            return strongTableView ?? super.tableView
        }
        set {
            strongTableView = newValue
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // theoretically we could use self.tableView = self.tableView but compiler will not let us assign a property to itself
        self.tableView = self.view as? UITableView
        self.view = UIView(frame: self.tableView!.frame)
        self.view.addSubview(tableView)

    }

}
1 голос
/ 10 января 2011

try: [self.view bringSubviewToFront:self.progView];

Или вы можете попытаться добавить self.progView в представление таблицы.

1 голос
/ 14 марта 2017

Чтобы сохранить UIView над табличным представлением в UITableViewController, я использую один (или несколько) методов делегата (UITableViewDelegate).

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.addSubview(headerView)
}

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    tableView.addSubview(overlayView) // adds view always on top
}
// if using footers in table view
tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) { ... }

Поскольку представления могут иметь только одно суперпредставление, швы которого тоже являются хорошим решением,поправьте меня если я ошибаюсь.Все еще получаю 60 кадров в секунду, так что это хорошо для меня.

0 голосов
/ 22 июля 2013

У меня была похожая проблема, когда я хотел добавить индикатор загрузки поверх моего UITableViewController. Чтобы решить эту проблему, я добавил свой UIView в качестве подпредставления окна. Это решило проблему. Вот как я это сделал.

-(void)viewDidLoad{
    [super viewDidLoad];
    //get the app delegate
    XYAppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    //define the position of the rect based on the screen bounds
    CGRect loadingViewRect = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 50, 50);
    //create the custom view. The custom view is a property of the VIewController
    self.loadingView = [[XYLoadingView alloc] initWithFrame:loadingViewRect];
    //use the delegate's window object to add the custom view on top of the view controller
    [delegate.window addSubview: loadingView]; 
}
0 голосов
/ 18 февраля 2014

Могут быть причины не делать этого, но пока это работает для меня. Если вы используете AP

Внутри viewDidLayoutSubviews вы можете запустить это, но убедитесь, что запускаете его только один раз, очевидно

self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain];
self.searchTableView.backgroundColor = [UIColor purpleColor];
[self.view.superview addSubview:self.searchTableView];
0 голосов
/ 25 марта 2016

попробуйте что-то вроде этого:

[self.tableView addSubview:overlayView];
overlayView.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...