Squeak.ru - шаблоны программирования

Установить вставку содержимого UITableView на постоянной основе

В моем приложении у меня есть UISearchBar под UINavigationBar, поэтому он всегда виден пользователю. В этом случае мне пришлось установить для contentInset дополнительные 44 пикселя, чтобы UIScrollView прокручивалось под UISearchBar (точно так же, как в приложении Contacts.app). И не было бы проблем со статическими UITableView, но в моем случае мне нужно перезагрузить его содержимое, переключиться на UISearchDisplayControllerи т.д. Итак, когда я звоню:

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];

Все работает, пока, например. Тяну обновить... (для этого использую SSPullToRefresh).

Итак, мой вопрос: Как я могу установить contentInset на постоянной основе, чтобы мне не пришлось беспокоиться о каких-либо изменениях, происходящих с данными внутри UITableView?


Ответы:


1

Вероятно, это была какая-то моя ошибка из-за того, что я возился с автомакетами и раскадровкой, но я нашел ответ.

Вы должны позаботиться об этом маленьком парне в инспекторе атрибутов View Controller asvi

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

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example

iOS 11, обновление Xcode 9

Похоже, что предыдущее решение больше не является правильным, если речь идет о iOS 11 и Xcode 9. automaticallyAdjustsScrollViewInsets устарел, и прямо сейчас для достижения аналогичного эффекта вам нужно перейти в Инспектор размеров, где вы можете найти это: введите здесь описание изображения
Кроме того, вы можете добиться то же самое в коде:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}
25.02.2014
  • Гений! Я думаю, что этот маленький парень должен быть снят по умолчанию. Теперь то, что есть в раскадровке (uitableview и uiscrollview), соответствует тому, что есть у меня на iPhone. 26.06.2014
  • Это беспокоило меня в течение нескольких месяцев, но недостаточно, чтобы найти это. Спасибо 01.04.2015
  • Спасибо! Когда маленький парень проверен, SB играет с contentInsets в viewDidLayoutSubviews (между viewWillAppear и viewDidAppear). 25.03.2016
  • Что эквивалентно в Swift 2.3? 18.10.2016
  • @JayprakashDubey не должно быть большой разницы... self.tableView.contentInset = UIEdgeInsetsMake(108, 0, 0, 0) 18.10.2016
  • на что намекает этот мальчишка? EDITED: настроить вставки прокрутки. Мне пришлось скачать изображение, чтобы увидеть это 13.01.2017
  • @WilliamGP это галочка «Настроить вставки прокрутки» в инспекторе атрибутов ???? 13.01.2017
  • Достаточно было установить automaticallyAdjustsScrollViewInsets на .never — не нужно менять вставки Adjust Scroll View. 10.12.2019

  • 2

    В Свифте:

    override func viewDidLayoutSubviews() {
          super.viewDidLayoutSubviews()
          self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
    }
    
    01.10.2015
  • Почему бы не позвонить super.viewDidLayoutSubviews() ? 10.02.2016
  • В этом нет необходимости, потому что реализация viewDidLayoutSubviews по умолчанию ничего не делает. (Источник: developer.apple.com/library/ios/documentation/UIKit/Reference/ ) 10.02.2016
  • Это правда Йоханнеке. Лучше всего вызывать super в случае изменений архитектуры в вашем собственном приложении или изменений в UIKit от Apple. 18.04.2016

  • 3

    AutomaticAdjustsScrollViewInsets устарел в iOS11 (и принятое решение больше не работает). использовать:

    if #available(iOS 11.0, *) {
        scrollView.contentInsetAdjustmentBehavior = .never
    } else {
        automaticallyAdjustsScrollViewInsets = false
    }
    
    31.10.2017
  • Было бы неплохо иметь возможность привязывать contentInsets к выбранной безопасной области (т.е. не ко всем) 02.11.2017

  • 4

    Добавьте в numberOfRowsInSection свой код [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];. Таким образом, вы будете устанавливать свой contentInset всегда, когда вы перезагружаете данные в свою таблицу.

    25.02.2014
  • Это не работает. Когда я тяну, чтобы обновить содержимое, вставка восстанавливается до заводских настроек. 25.02.2014
  • Может быть, попробуйте перенести эту строку на viewDidLayoutSubviews. 25.02.2014
  • Вы также можете добавить панель поиска в качестве заголовка таблицы, например, так [tableView setTableHeaderView:yourSearchBar]; 25.02.2014
  • Но панель поиска должна быть всегда видна пользователю. Ничего, я нашел решение. Прочитай мой ответ. 25.02.2014

  • 5

    После одного часа тестов единственным способом, который работает на 100%, является этот:

    -(void)hideSearchBar
    {
        if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
        {
            self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
            self.edgesForExtendedLayout = UIRectEdgeBottom;
        }
    }
    
    -(void)viewDidLayoutSubviews
    {
        [self hideSearchBar];
    }
    

    при таком подходе вы всегда можете скрыть панель поиска, если она пуста

    10.04.2015

    6

    Вот как это можно легко исправить с помощью Storyboard (iOS 11 и Xcode 9.1):

    Выберите «Представление таблицы» > «Инспектор размеров» > «Вставки содержимого»: «Никогда».

    02.11.2017

    7

    Попробуйте установить tableFooterView tableView.tableFooterView = UIView (frame: CGRect (x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))

    26.04.2019
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...