Как поместить кнопки над UITableView, которые не будут прокручиваться с таблицей в iOS
Я хочу поместить кнопки над UITableView
, которые остаются на одном и том же месте экрана, не будет прокручиваться с помощью UITableView
. Когда я пытался использовать кнопки addSubview
, они отображаются, но прокручиваются с помощью UITableView
.
Причиной пуска кнопок над UITableView
является то, что пользователь может управлять некоторыми действиями на нем. Я не говорю о наличии кнопок в ячейке. Они - плавающие кнопки, которые никогда не перемещают свое положение.
Я использую UITableViewController
, и я не хочу использовать верхний или нижний колонтитул для этой цели. А еще один бар (UIToolbar
, например) для меня не вариант.
Спасибо заранее.
Ответы
Ответ 1
Одним из решений этого является расширение UIViewController
вместо UITableViewController
. Вам нужно будет добавить собственный вид таблицы и настроить все. Затем вы можете добавить свою кнопку в представление контроллера просмотра вместо представления таблицы.
Ответ 2
Вы можете сделать это также с помощью UITableViewController
(нет необходимости в обычном UIViewController
, который разбивает вашу таблицу или VC)
Прокручивая таблицу, вам нужно отрегулировать положение "плавающего" вида, и это будет нормально
Если вы находитесь в UITableViewController, просто
Если вы хотите поместить представление вверху UITableView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect frame = self.floatingView.frame;
frame.origin.y = scrollView.contentOffset.y;
self.floatingView.frame = frame;
[self.view bringSubviewToFront:self.floatingView];
}
Если вы хотите поплавать над представлением внизу UITableView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect frame = self.floatingView.frame;
frame.origin.y = scrollView.contentOffset.y + self.tableView.frame.size.height - self.floatingView.frame.size.height;
self.floatingView.frame = frame;
[self.view bringSubviewToFront:self.floatingView];
}
Я считаю, что это реальный ответ на ваш вопрос
Ответ 3
Если вы используете навигационный контроллер, вы можете добавить к нему представление:
[self.navigationController.view addSubview:yourView];
Пример:
UIButton *goToTop = [UIButton buttonWithType:UIButtonTypeCustom];
goToTop.frame = CGRectMake(130, 70, 60, 20);
[goToTop setTitle:@"go to top" forState:UIControlStateNormal];
[goToTop addTarget:self action:@selector(goToTop) forControlEvents:UIControlEventTouchUpInside];
[goToTop setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[goToTop.layer setBorderColor:[[UIColor whiteColor] CGColor]];
goToTop.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13];
[self.navigationController.view addSubview:goToTop];
Ответ 4
Если вы хотите показать статический вид управления, охватывающий вид таблицы, у вас есть три варианта:
1) Не используйте UITableViewController. Вместо этого создайте UIViewController с подвью UITableView и поместите код представления делегата/источника данных Table View в UIViewController. Этот параметр может работать или не работать в зависимости от архитектуры вашего приложения. Например, если вы пытаетесь реализовать подкласс UITableViewController с большим количеством пользовательской логики, это не идеально.
2) Метод WWDC 2011. См. Сессию WWDC 2011 "Изменения, подсказки и хитрости UITableView", начиная с 32:20. Этот метод настройки размещения представления всякий раз, когда прокрутки таблицы были рекомендованы Apple до того, как AutoLayout был представлен в iOS и до того, как у нас было так много разных размеров экрана. Я не рекомендую это, так как вы сами будете управлять позициями для всех разных размеров экрана.
3) Я рекомендую использовать UIViewController с представлением контейнера, который будет содержать ваш UITableViewController.. Таким образом, вы можете поддерживать логику просмотра таблицы отдельно в UITableViewController. UIViewController размещает "немой" контейнер для UITableViewController, а также имеет представление статического контроля. Чтобы сделать это, перетащите UIViewController в свою раскадровку и перетащите "Container View" внутри него. Удалите UIViewController, который автоматически присоединяется к представлению контейнера, а затем присоедините свой контроллер табличного представления, который будет отображаться в представлении контейнера, путем перетаскивания элемента управления из представления диспетчера в контроллер представления таблицы и выбора "embed". Теперь вы можете добавить статические элементы управления в качестве подзонов в UIViewController, которые будут отображаться поверх табличного представления. Он будет выглядеть примерно так:
![Storyboard For a UITableViewController inside a container view]()
Я предпочитаю этот метод, потому что UIViewController может обрабатывать логику управления, а UITableViewController обрабатывает логику табличного представления. Некоторые другие ответы здесь рекомендуют добавить статический контроль в качестве подзадачи в контроллер навигации или окно. Они работают только до тех пор, пока вы никогда не добавляете в контроллер навигации или окно другой контроллер вида.
Ответ 5
вы можете добавлять кнопки в UIWindow, не нужно расширять его до UIViewController, а не UITableviewController. Просто добавьте кнопки в окно.
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIButton *btn =[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(60, 200,40, 60)];
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:btn];
Ответ 6
Для быстрого:
override func scrollViewDidScroll(scrollView: UIScrollView){
var frame: CGRect = self.floatingView.frame
frame.origin.y = scrollView.contentOffset.y
floatingView.frame = frame
view.bringSubviewToFront(floatingView)
}
Эта функция вызывается при каждом прокрутке. Затем внутри вы получаете кадр вашего UIView и обновляете его положение в зависимости от того, сколько вы прокрутили. Ваш UIView постоянно перемещается с вашим UIScrollView, поэтому пользователю он выглядит как плавающий.
Ответ 7
Я создал библиотеку, чтобы упростить добавление плавающей кнопки поверх UITableView/ UICollectionView/ UIScrollView, Вызывается MEVFloatingButton.
Это шаги для его использования.
1- Файл категории импорта
#import "UIScrollView+FloatingButton.h"
2 - Добавить делегат и необязательные методы делегатов.
@interface ViewController () <MEVFloatingButtonDelegate>
#pragma mark - MEScrollToTopDelegate Methods
- (void)floatingButton:(UIScrollView *)scrollView didTapButton:(UIButton *)button;
2 - Создайте MEVFloatingButtonobject.
MEVFloatingButton *button = [[MEVFloatingButton alloc] init];
button.animationType = MEVFloatingButtonAnimationFromBottom;
button.displayMode = MEVFloatingButtonDisplayModeWhenScrolling;
button.position = MEVFloatingButtonPositionBottomCenter;
button.image = [UIImage imageNamed:@"Icon0"];
button.imageColor = [UIColor groupTableViewBackgroundColor];
button.backgroundColor = [UIColor darkGrayColor];
button.outlineColor = [UIColor darkGrayColor];
button.outlineWidth = 0.0f;
button.imagePadding = 20.0f;
button.horizontalOffset = 20.0f;
button.verticalOffset = -30.0f;
button.rounded = YES;
button.hideWhenScrollToTop = YES;
4 - Назначить кнопку и делегировать UITableView.
[self.tableView setFloatingButtonView:button];
[self.tableView setFloatingButtonDelegate:self]
Демо-результаты
< img src= "https://i.stack.imgur.com/7OrIG.gif" alt= "Demo" > ![Demo]()
Ответ 8
Я только что увидел видеоролики TableView, Tips and Tricks в WWDC 2011.
Плавающие представления - это одно и то же. Все, что вам нужно сделать, это изменить рамку обратно в исходное положение на scrollViewDidScroll.
https://developer.apple.com/videos/wwdc/2011/
Просмотрите подсказки и трюки TableViews.
Ответ 9
для этого есть лучшее решение. вы можете сделать это, отключив свойство Auto Layout (button.translatesAutoresizingMaskIntoConstraints = false) соответствующего Button
или любого UIView
для плавающей кнопки:
Swift 4
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}