Как добавить UIView над текущим UITableViewController

Мне трудно добавить subview (UIView) из метода viewDidLoad для UITableViewController

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

[self.view addSubview:self.progView]; 

Но вы можете видеть, что линии ячейки ячейки истекают через прогист UIView.

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

 [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 появляется, но, по-видимому, за столом.

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

Вместо этого я добавил представление, которое я хотел добавить над своим UITableView в представление UINavigationController UITableViewController, как таковое:

 [self.navigationController.view addSubview:]; 

Этот подход требует, чтобы вы включили UITableViewController в UINavigationController, но даже если вам не нужен controller навигации, вы все равно можете использовать этот подход и просто скрыть панель навигации.

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

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

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

 IBOutlet UITableView *tableViewReference; // to keep a reference to the tableview UIView *viewReference; // a reference to the new background view 

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

Затем в файле реализации :

 // Override the default accessors of the tableview and view - (UITableView*)tableView { return tableViewReference; } - (UIView*)view { return viewReference; } - (void)viewDidLoad { [super viewDidLoad]; // instantiate the new self.view, similar to the tableview viewReference = [[UIView alloc] initWithFrame:tableViewReference.frame]; [viewReference setBackgroundColor:tableViewReference.backgroundColor]; viewReference.autoresizingMask = tableViewReference.autoresizingMask; // add it as a subview [viewReference addSubview:tableViewReference]; /* remainder of viewDidLoad */ } 

Хотя это может показаться странным, UITableViewController делает много причудливых вещей с рекомендациями за кулисами. Вам нужно дождаться viewDidLoad, чтобы сделать своп. После этого точки доступа будут указывать на правильный UIView и UITableView .

Использование: что-то вроде

  [self.view addSubview:myView]; 

добавит myView myView перед представлением таблицы, без прокрутки myView с содержимым табличного представления.

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

Ive смог добавить subview поверх uitableviewcontroller с помощью утилиты uiviewcontroller.

UITableViewController на самом деле очень удобен, когда дело доходит до статических ячеек, и это, вероятно, единственный раз, когда общий ответ «просто использовать uitableview» может фактически не быть жизнеспособным.

Так вот как я это делаю.

  1. дать вашему UITableViewController идентификатор StoryBoard, то есть MyStaticTableView
  2. создайте новый подclass UIViewController и назовите его UITableViewControllerContainer
  3. поместите этот controller вместо вашего UITableViewController внутри вашей раскадровки
  4. добавьте subview к новому controllerу и свяжите его с выходом, называемым « view_container »,
  5. на вас UITableViewControllerContainer viewDidLoad метод

добавить код:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UITableViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyStaticTableView"]; [self addChildViewController:vc]; [self.view_container addSubview:vc.view]; } 

Проблемы, которые могут возникнуть:

  1. если у вас есть дополнительное верхнее пространство, то обязательно добавьте флаг «хочет полноэкранный режим» в ваш UITableViewController
  2. если он не будет правильно изменен на вашем UITableViewControllerContainer

добавить код:

 - (void)viewWillAppear:(BOOL)animated { [[self.view_container.subviews lastObject] setFrame:self.view.frame]; } 

в этот момент из вашего UITableViewController вы можете получить доступ к виду контейнера непосредственно с помощью

self.view.superview.superview

и все, что вы добавите к нему, будет отображаться сверху вашего controllerа табличного представления

Вы можете увеличить zPosition слоя вашего представления.

Это заставит его отображать над другими представлениями (которые по умолчанию имеют значение zPosition, равное 0)

 self.progView.layer.zPosition++; [self.view addSubview:self.progView]; 

Проблема в том, что свойство view UITableViewController идентично tableView . Это означает, что корневой вид всегда является controllerом табличного представления, и все, что добавлено в качестве подвью, будет подчиняться функциональности представления таблиц. У этого есть другие нежелательные побочные эффекты, такие как прокрутки вашего подпрограммы, когда вы не можете их хотеть.

Здесь есть пара вариантов. Вы можете переопределить loadView и установить собственный вид и табличный вид:

 // note: untested - (void)loadView { self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; self.view.backgroundColor = [UIColor whiteColor]; UITableView *tblView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain ]; tblView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ; self.tableView = tblView; [self.view addSubview:tblView]; [tblView release]; } 

А затем, когда вам нужно добавить subview, добавьте его ниже или выше self.tableView если это необходимо.

Другим вариантом является создание подclassа UIViewController который делает то, что вам нужно. UITableViewController честно не добавляет этого, и небольшая функциональность, которую он реализует, легко реплицируется. Существуют статьи, такие как Recreating UITableViewController для увеличения повторного использования кода, которые объясняют, как сделать это довольно легко.

Пример Apple «iPhoneCoreDataRecipes» использует NIB для загрузки заголовка в UITableView. См. Здесь :

Я добавил изображение над таблицей. Я использовал этот код:

 self.tableView.tableHeaderView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]]; 

У меня была схожая проблема, и я решил ее решить, используя следующий код:

  [self.navigationController.view insertSubview: belowSubview:self.navigationController.navigationBar]; 

Это вставляет вид в правильном месте, используя controllerы, присутствующие в Stack.

Поскольку UITableViewController является подclassом UIViewController, вам нужно добавить свой вид в свой супервизор.

 Swift: self.view.superview?.addSubview(viewTobeAdded) Objective C: [self.view.superview addSubview: viewTobeAdded]; 

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

 [self.tableView.superview addSubview:]; 

Решение для быстрого (эквивалентное Даниэлю Сайди):

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

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

Затем в файле реализации:

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

 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) 

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

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

Чтобы сохранить 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 кадров в секунду, так что это нормально для меня.

Swift 2018

Вот мой путь с раскадрой:

1) Добавьте представление в раскадровку.
введите описание изображения здесь

2) Свяжите его с classом UITableViewController:

 @IBOutlet weak var copyrightLabel: UILabel! 

3) Добавьте его в код

 self.navigationController?.view.addSubview(copyrightView) copyrightView.frame = CGRect(x: 0, y: self.view.bounds.size.height - copyrightView.bounds.size.height, width: self.view.bounds.size.width, height: copyrightView.bounds.size.height) 

4) Войля!
введите описание изображения здесь

Вид не будет прокручиваться в виде таблицы. Это может быть легко продумано из раскадровки.

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

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

 self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain]; self.searchTableView.backgroundColor = [UIColor purpleColor]; [self.view.superview addSubview:self.searchTableView]; 

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

 -(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]; } 

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

 [self.tableView addSubview:overlayView]; overlayView.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1; 

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

Теперь можно использовать Subview для 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] ]]; 
  • CALayer: добавить границу только с одной стороны
  • Как изменить формат даты в подборщике даты
  • Как написать простой метод Ping в Cocoa / Objective-C
  • UIWebView - Как определить последнее сообщение webViewDidFinishLoad?
  • Как сделать ui отзывчивым все время и делать обновление фона?
  • Комплект iPhone Store «Не удается подключиться к iTunes Store»
  • UIScrollView - показывает полосу прокрутки
  • objective-C - Когда использовать «я»,
  • Как преобразовать значения NSString в шестнадцатеричные значения
  • захват себя в этом блоке, вероятно, приведет к циклу сохранения
  • Какую строку формата я использую в миллисекундах в строках даты на iPhone?
  • Давайте будем гением компьютера.