Как поместить кнопки поверх UITableView, которые не будут прокручиваться с таблицей в iOS


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

причина поставить кнопки над UITableView позволить потребителю привестись в действие некоторое действие на ем. Я не говорю о наличии кнопок в камере. Они плавающие кнопки, которые никогда не перемещает свое положение.

Я использую UITableViewController и я не хочу использовать колонтитул для этой цели. И также еще один какой-то бар (UIToolbar например) не вариант для меня.

спасибо заранее.

9 61

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

Storyboard For a UITableViewController inside a container view

Я предпочитаю этот метод, потому что 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]

демо результаты

DemoDemoDemo

Я только что видел 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
}