АвтоматическиAdjustsScrollViewInsets не работает

Я создал чрезвычайно простое демонстрационное приложение для тестирования функциональности automaticallyAdjustsScrollViewInsets, но последняя ячейка таблицыView покрыта моей панелью вкладок.

Мой код AppDelegate:

UITabBarController *tabControl = [[UITabBarController alloc] init];
tabControl.tabBar.translucent = YES;
testViewController *test = [[testViewController alloc] init];
[tabControl setViewControllers:@[test]];

[self.window setRootViewController:tabControl];

Мой testViewController (подкласс UITableViewController) Код:

- (void)viewDidLoad
{
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = YES;
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.dataSource = self;
self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
//[self.view addSubview:self.tableView];

// Do any additional setup after loading the view.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@""];
cell.textLabel.text = @"test";
return cell;
}

Является ли это ошибкой в ​​iOS 7? Если нет, что я сделал не так?

Ответ 1

Я думаю, что automaticallyAdjustsScrollViewInsets работает только тогда, когда ваши контроллеры view являются UIScrollView (табличный вид - один).

Кажется, что проблема заключается в том, что ваш контроллер view является регулярным UIView, а ваш UITableView является только подвью, поэтому вам придется либо:

  • Сделать таблицу вид "root".

  • Отрегулируйте вставки вручную:

    UIEdgeInsets insets = UIEdgeInsetsMake(controller.topLayoutGuide.length,
                                           0.0,
                                           controller.bottomLayoutGuide.length,
                                           0.0);
    scrollView.contentInset = insets;
    

Edit:

Кажется, что SDK способен настраивать некоторые виды прокрутки, несмотря на то, что они не являются корневым представлением контроллера.

Пока он работает с UIScrollView и UIWebView scrollView, когда они являются подвью в индексе 0.

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

Ответ 2

Контроллер вашего представления должен быть непосредственно в стеке UINavigaitonController для automaticallyAdjustsScrollViewInsets для работы (т.е. не для контроллера детского представления)

Если это контроллер дочернего представления другого контроллера представлений, который находится в стеке навигации, вы можете вместо этого установить automaticallyAdjustsScrollViewInsets = NO в родительском элементе. В качестве альтернативы вы можете сделать это:

self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;

Ответ 3

У меня была одна и та же проблема - представление таблицы с нежелательным верхним дополнением.

Все ответы говорят исправить, установив automaticallyAdjustsScrollViewInsets = NO, но это не устраняет отступы для меня.

Подобно другим ответам здесь, эти направления нужно немного подправить, если вы используете нестандартную иерархию представлений.

У меня был UIViewController со встроенным UITableViewController. Он не работал над установкой automaticallyAdjustsScrollViewInsets в Table View Controller.

Вместо этого я установил automaticallyAdjustsScrollViewInsets = NO в родительский UIViewController, который встраивал мой Table View Controller. Это успешно устранило отступы в представлении таблицы.

Ответ 4

Я знаю, что это сообщение немного устарело, но я просто решил эту проблему с iOS 11 и быстрым 4, моя текущая проблема заключалась в том, что у iOS11 есть новое свойство для проверки вложений, когда ScrollView существует, это contentInsetAdjustmentBehavior, который является свойством ScrollView, а свойство по умолчанию - automatic, поэтому мой код:

if #available(iOS 11, *) {
    myScroll.contentInsetAdjustmentBehavior = .never
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Я надеюсь, что это также решит ваши проблемы...

Ответ 5

У меня есть эта иерархия:

  • настраиваемый контроллер навигации содержит настраиваемый элемент управления tabbarcontroller

  • Пользовательский элемент управления tabbarcontroller содержит несколько контроллеров

  • эти контроллеры содержат subviews, и один из них содержит подкласс uiscrollview.

Мне пришлось установить autoAdjustsScrollViewInsets в NO

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.automaticallyAdjustsScrollViewInsets = NO;

в настраиваемом tabbarcontroller. Другие контроллеры в иерархии не влияют на поведение представления вложенных прокруток.

Ответ 6

self.textView.contentInset = UIEdgeInsetsMake(1.0,0.0,0,0.0);
[self setEdgesForExtendedLayout:UIRectEdgeNone];