Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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]

Демо-результаты

Demo < 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
}