Как поместить кнопки поверх UITableView, которые не будут прокручиваться с таблицей в iOS
Я хочу поставить кнопки UITableView
который остается на той же позиции экрана, не будет прокручивать с UITableView
. Когда я пытался addSubview
кнопки, они отображаются, но свитки с UITableView
.
причина поставить кнопки над UITableView
позволить потребителю привестись в действие некоторое действие на ем. Я не говорю о наличии кнопок в камере. Они плавающие кнопки, которые никогда не перемещает свое положение.
Я использую UITableViewController
и я не хочу использовать колонтитул для этой цели. И также еще один какой-то бар (UIToolbar
например) не вариант для меня.
спасибо заранее.
9 ответов:
одним из решений этого является расширение
UIViewController
вместоUITableViewController
. Вам нужно будет добавить свой собственный вид таблицы и настроить все. Затем вы можете добавить свою кнопку в представление контроллера вида вместо представления таблицы.
вы можете сделать это также с
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]; }
Я считаю, что это реальный ответ на твой вопрос
Если вы используете навигационный контроллер, вы можете добавить к нему представление:
[self.navigationController.view addSubview:yourView];
пример:
UIButton *goToTopButton = [UIButton buttonWithType:UIButtonTypeCustom]; goToTopButton.frame = CGRectMake(130, 70, 60, 20); [goToTopButton setTitle:@"Scroll to top" forState:UIControlStateNormal]; [goToTopButton addTarget:self action:@selector(goToTop) forControlEvents:UIControlEventTouchUpInside]; [goToTopButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [goToTopButton.layer setBorderColor:[[UIColor whiteColor] CGColor]]; goToTopButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13]; [self.navigationController.view goToTopButton];
Если вы хотите показать статическое представление элемента управления, охватывающее представление таблицы, у вас есть три варианта:
1) Не используйте UITableViewController. Вместо этого создайте UIViewController с подвидом UITableView и поместите свой делегат табличного представления/код источника данных в UIViewController. Эта опция может не работать в зависимости от архитектуры вашего приложения. Например, если вы пытаетесь реализовать подкласс UITableViewController с большим количеством пользовательской логики, это не так идеальный.
2) Метод WWDC 2011. См. WWDC 2011 сессия 125 "UITableView изменения, советы и рекомендации", начиная с 32:20. Этот метод настройки размещения представления всякий раз, когда прокручивается представление таблицы, был рекомендован Apple до того, как AutoLayout был представлен iOS и до того, как у нас было так много разных размеров экрана. Я не рекомендую его, так как вы будете управлять позиций для различных размеров экрана самостоятельно.
3) Я рекомендую использовать UIViewController с видом контейнера, который будет содержать ваш UITableViewController. таким образом, вы можете сохранить логику представления таблицы отдельно в UITableViewController. UIViewController размещает "тупой" контейнер для UITableViewController, а также содержит представление статического элемента управления. Чтобы сделать это, перетащите для UIViewController, чтобы ваши раскадровки и перетащите "посмотреть контейнер" внутри него. Удалите UIViewController, который автоматически подключается к представлению контейнера, а затем присоедините контроллер и вид таблицы, которые будут отображаться в виде контейнера с контролем перетаскивая из contrainer к контроллеру представления таблицы и выбрав "вставить". Теперь вы можете добавить статические элементы управления в виде вложенных представлений в UIViewController, которые будут отображаться поверх табличного представления. Это будет выглядеть примерно так:
Я предпочитаю этот метод, потому что UIViewController может обрабатывать логику управления и UITableViewController обрабатывает логику представления таблицы. Некоторые другие ответы здесь рекомендуют добавить статический элемент управления в качестве подвида к навигационному контроллеру или окну. Они работают только до тех пор, пока вы никогда не добавляете другой контроллер вида в навигационный контроллер или окно.
для swift:
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, поэтому для пользователя он выглядит как плавающий.
вы можете добавить кнопки на 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];
Я создать библиотеку для того, чтобы сделать его проще, чтобы добавить плавающую кнопку на вершине 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]
демо результаты
Я только что видел WWDC 2011 TableView, советы и рекомендации видео. Плавающие виды-это точно то же самое.Все, что вам нужно сделать, это изменить кадр обратно в исходное положение на scrollViewDidScroll.
https://developer.apple.com/videos/wwdc/2011/
Проверьте видео TableViews советы и рекомендации.
существует лучшее решение для этого. вы можете сделать это, отключив автоматический макет(кнопка.translatesAutoresizingMaskIntoConstraints = false) свойство соответствующего
Button
иUIView
для плавающей кнопки:Swift 4
//create a button or any UIView and add to subview let button=UIButton.init(type: .system) button.setTitle("NEXT", for: .normal) let button.frame.size = CGSize(width: 100, height: 50) self.view.addSubview(nextButton) //set constrains 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 }