iOS 7: UITableView відображається в рядку стану


219

Перший екран моєї програми - це UITableViewControllerпанель навігації, що означає, що вміст протікає під рядком стану, тому виникає багато текстових зіткнень. Я скоригував обидві властивості, Under top barsі Adjust scroll view insetsякі насправді не дозволяють йому прокручуватися під, але ціною, щоб утримувати подання вгорі таблиці. Я намагався встановити UITableViewрамку на компенсацію на 20 пікселів, але, здається, це не набуває чинності, і оскільки мені зараз потрібна програма, сумісна з iOS 6, я не можу перейти на дошки розказок iOS 7, щоб змусити використовувати авторозкладку верхній напрямник по висоті. Хтось знайшов рішення, яке працює для обох версій?

Те, що я спробував: налаштування edgesForExtendedLayout, зміна налаштувань в "Інтернеті" для Under top barsта Adjust scroll viewпримушення кадру до нової області.

Малюнок вартує тисячі слів: Потік рядка стану під


2
Швидкий обхід може стати додаванням порожнього 20-піксельного заголовка до таблиці під час роботи на iOS 7.
EricS

@EricS: У мене вже є UITableViewзаголовок, він також надходить під рядок стану.
Ніколас Сміт

Чому б не скористатися посібником з автоматичного планування на iOS 6? Це працює.
Стівен Фішер

Відповіді:


366

Для всіх, хто зацікавлений повторити це, просто виконайте наступні дії:

  1. Створіть новий проект iOS
  2. Відкрийте основну дошку та видаліть стандартну / початкову UIViewController
  3. Витягніть нове UITableViewControllerз бібліотеки об’єктів
  4. Встановіть його як початковий контролер подання
  5. Подайте в таблицю деякі дані тесту

Якщо виконати вищезазначені кроки, під час запуску програми ви побачите, що нічого, включаючи встановлення прапорців Xcode на "Розширення країв під {Верх, Низ, Непрозорий} Прутки", не працює, щоб зупинити показ першого ряду під рядком стану, і ви не можете вирішити це програмно.

Наприклад , у наведеному вище сценарії, наступний не матиме НЕ ефект:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Це питання може бути дуже неприємним, і я вважаю, що це помилка в кінці Apple, тим більше, що вона з'являється в їх власному попередньому з'єднанні UITableViewControllerз бібліотеки об'єктів.

Я не погоджуюся з усіма, хто намагається вирішити це за допомогою будь-якої форми "Чарівних чисел", наприклад "використовувати дельту 20 пікселів". Цей тип щільно поєднаного програмування, безумовно, не те, що Apple хоче, щоб ми тут робили.

Я виявив два рішення цієї проблеми:

  • Збереження UITableViewControllerсцени " .
    Якщо ви хочете зберегти UITableViewControllerв дошці розкадровку, не розміщуючи її в іншому вікні вручну, ви можете вставити UITableViewControllerв нього UINavigationController(Редактор> Вставити> Контролер навігації) і зняти галочку" Показувати панель навігації "в інспекторі . Це вирішує проблему, не потребуючи додаткових налаштувань, а також зберігає UITableViewControllerсцену вашої в розгортці.

  • Використання функції AutoLayout та вбудовування UITableViewв інший вигляд (я вважаю, що Apple хоче, щоб ми це зробили) :
    Створіть порожнє UIViewControllerта перетягніть його UITableViewв нього. Потім натисніть клавішу Ctrl з UITableViewпанелі стану. Коли миша підніметься до нижньої частини рядка стану, ви побачите міхур з автоматичним розташуванням, на якому написано "Посібник із верхнім розташуванням". Відпустіть мишку та оберіть "Вертикальний пробіл". Це покаже системі макета розмістити її прямо під рядком стану.

Я перевірив обидва способи на порожній програмі, і вони обидва працюють. Можливо, вам доведеться зробити кілька додаткових налаштувань, щоб вони працювали на ваш проект.


5
FYI, варіант 1 (вбудовування в контролер навігації) призводить до того, що клітини будуть видні за напівпрозорою панеллю стану під час прокрутки таблиці.
RyanR

4
@RyanR Я теж це помітив, але я думаю, що в якийсь момент це нормально. Apple зробила те ж саме у відкритому вікні вкладок мобільного Safari, вкладки відображатимуться під рядком стану. Рішення навігаційного контролера - це найпростіший спосіб вирішення. Однак напівпрозора смужка стану - дурна ідея.
Гордість Чунг

6
Коли я роблю перетягування з перегляду таблиці вгору, я ніколи не біжу в рядок стану. На екрані немає видимого рядка стану, не впевнений, що ви тут маєте на увазі ...
Jesse

4
Варіант 2 більше не працює в Xcode 5. Описана дія (ctrl-drag) ніколи не повинна працювати, оскільки це належить системі Outlets, але навіть якщо ви перетягуєте вручну до дерева сцен ліворуч, керівництво верхнього макета НЕ ПРАЦЮЄ (це має зробити, AFAICT - я вважаю, що це ще одна значна помилка в AutoLayout :( :()
Адам

3
@PrideChung виглядає дурним при використанні заголовка з табличним переглядом, заголовок залишається зафіксованим у верхній частині, а елементи зникнуть позаду - і з’являться за прозорою смугою стану ...
Ixx,

86

Якщо ви займаєтеся систематично і використовуєте UITableViewControllerбез UINavigationControllerнайкращого курсу, це зробити наступне viewDidLoad:

Швидкий 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Раніше Свіфт

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

Волосся UITableViewControllerвсе ще прокручуватиметься за рядком стану, але не буде під ним, коли прокручується доверху.


1
Ви можете додати чек на версію ОС> 7 та підтримувати і більш старі ОС (для них немає вставки). Інакше це спрацювало добре для моїх цілей.
SimpsOff

8
Значення висоти жорсткого кодування - не найкраща ідея.
Maciej Kozieł

3
Так, topLayoutGuideзамість цього використовуйте довжину.
lipka

10
Я б використовував UIApplication.sharedApplication.statusBarFrame.size.heightзамість 20.
mojuba

Цього дня оновлено до UIApplication.shared.statusBarFrame.size.height.
asetniop

23

Зверніть увагу: це працювало для мене для наступної конфігурації:

  • Немає навігаційної панелі у верхній частині екрана (подання таблиці відповідає рядку стану)
  • Перегляд таблиці не можна прокручувати

Якщо вищевказані дві вимоги не виконані, ваш пробіг може відрізнятися.

Оригінальна публікація

Я створив свій погляд програмно, і це закінчилося для мене:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Джерело (у розділі topLayoutGuide внизу сторінки.39).


Цікаво ... Я міг назвати це так у своєму проекті без будь-яких проблем ... У мене може бути простіша структура макета перегляду, ніж у вас. Ваша пропозиція правильна, я внесу цю зміну у свою відповідь.
оглушення

Я випадково натрапив на проблему, коли повернув додаток. Якби у вас відключена ротація, ви, ймовірно, не мали б проблеми.
Джеремі

У моєму проекті немає включеної ротації, і я зіткнувся з проблемою, але так, все-таки хороший момент.
оглушення

1
Для тих, хто реалізує свій власний контролер контейнерів, це правильний спосіб регулювання перекриття стану або навігаційної панелі!
Рафаель Нобре

Якщо ви зміните походження, але не висоту меж перегляду, чи не буде нижня частина екрана обрізана нижньою частиною екрана на суму, яку ви змінили походження? (тому стає неможливо побачити останні кілька рядків пікселів)
Tenfour04

20

Додавання до верхньої відповіді:

після 2-го методу спочатку не здавалося, що я працював, я зробив додаткові розробки і знайшов рішення.

TLDR; друге рішення верхньої відповіді майже працює, але для деяких версій xCode ctrl + перетягування до «Посібника з верхніх макетів» та вибору вертикального пробілу нічого не робить. Однак, спочатку відкоригувавши розмір перегляду таблиці, а потім вибравши «Посібник із верхнього простору до верхніх макетів» працює


  1. Перетягніть порожній ViewController на табло. Переглянути контролер

  2. Перетягніть UITableView об'єкт в поле зору. (Не UITableViewController). Розташуйте його в самому центрі за допомогою синіх напрямних.

Перегляд таблиці Зображення у центрі

  1. Перетягніть UITableViewCell в TableView. Це буде ваша комірка повторного використання прототипу, тому не забудьте встановити її ідентифікатор повторного використання на вкладці Атрибути, або ви отримаєте збій.

Додати клітинку перегляду таблиці Повторне використання ідентифікатора

  1. Створіть власний підклас UIViewController та додайте <UITableViewDataSource, UITableViewDelegate>протоколи. Не забудьте встановити ViewController вашої рекламної дошки на цей клас у Інспектора ідентичності.

  2. Створіть розетку для TableView у вашому файлі реалізації та назвіть його "tableView"

Створити розетку tableView

  1. Клацніть правою кнопкою миші TableView і перетягніть як DataSource, так і делегат до ViewController.

делегат данихSource

Тепер для того, щоб не врізатись у рядок стану.

  1. Візьміть верхній край таблиці таблиці та перемістіть його вниз до одного із пунктирних синіх посібників для автоматичного розміщення, розташованих біля верхньої частини

змінити розмір

  1. Тепер ви можете керувати перетягуванням з Табличного виду вгору та вибирати Посібник із верхнього простору до верхньої макети

Посібник від верхнього простору до верхнього макета

  1. Це дасть вам помилку щодо неоднозначного компонування TableView, просто додайте відсутні пропуски та завершене.

Додайте відсутні обмеження

Тепер ви можете налаштувати подання таблиці як звичайне, і воно не буде обрізати рядок стану!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
перемкнути <= на> та видалити порожній, якщо блок
pfrank

1
Читання self.topLayoutGuide.lengthз viewDidLayoutSubviewsнакрутить макет дитячих поглядів.

@OLzh, роблячи так, як ви описуєте, self.tableView не може прокручуватися.
DawnSong

8

Виберіть UIViewController на своїй дошці повідомлень, зніміть прапорець Розширити краї під верхніми рядками. Працювали для мене. :)


На жаль, не вийшло для мене. Повністю за замовчуванням UITableViewController все ще перекриває рядок стану. Я не думаю, що рядок стану вважається Топовою панеллю. Просто наві бари та панелі вкладок.
Ендрю Дункан

Єдине рішення, яке працює для мене, ти. (Зверніть увагу, що ви повинні "скоротити" подання таблиці під рядком стану в IB та обмежити оновлення).
Мартін Макарський

Працював для мене на Xcode 8 з UITableViewController.
Едуард Барб'є

8

Ось як це написати в "Швидкій" Налаштування відповіді на @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

Хіба тут не дозволено швидко?
uplearnedu.com

Єдине рішення, яке працювало для мене, що не змушує мене створити контролер UIVIewController
Марзук

1
Це менше, ніж ідеально, оскільки він тримає верхню частину вставки в 20, навіть у пейзажі, де в ios8 немає рядка стану за замовчуванням
voidref

Ця варіація добре справляється з будь-якою конфігурацією для мене:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

Для Xcode 7 для мене спрацювала відмітка галочки "напівпрозора" на панелі навігації.

введіть тут опис зображення


Найпростіший, швидкий, найпростіший, безпечний? рішення. Не знаю, чому це так мало відгуків порівняно з усіма іншими.
Gruntcakes

3

Це виправить це для UITableViewController (без будь-яких магічних чисел). Єдине, чого я не зміг домогтися, щоб це виправити - це якщо ви телефонуєте, і в такому випадку верхню частину таблиціView занадто сильно натиснуто вниз. Якщо хтось знає, як це вирішити, будь ласка, повідомте про це.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

Я не знаю, наскільки це кошер, але я виявив, що ця схема переміщує погляд ViewController вниз і надає рядку стану міцний фон:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Звичайно, замініть redColorбудь-яким кольором для фону.

Вам потрібно окремо виконати один із swizzles, щоб встановити колір символів / символів у рядку стану. Я використовую View controller-based status bar appearance = NOі Status bar style = Opaque black styleв плісті, щоб це зробити в усьому світі.

Здається, це працює, і мені буде цікаво почути будь-які помилки або проблеми з ним.


2

Відповідь chappjc чудово працює при роботі з XIB.

Я знайшов найчистіше рішення при програмному створенні TableViewControllers - загортаючи екземпляр UITableViewController в інший UIViewController і встановлюючи відповідно обмеження.

Ось:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Ура, Бен


1

Я думаю, що підхід до використання UITableViewController може дещо відрізнятися від того, що ви робили раніше. Це працювало на мене, але ви, можливо, не будете прихильником цього. Що я зробив - це контролер перегляду з видом контейнера, який вказує на мій UItableViewController. Таким чином, я можу використовувати TopLayoutGuide, наданий моєму в раскадровці. Просто додайте обмеження до подання контейнера, і вам слід подбати про iOS7 та iOS6.


1

Я в кінцевому підсумку використовував один додатковий вигляд з потрібним фоном, доданий після TableView і розміщений під рядком стану:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Це не дуже красиво, але це досить просте рішення, якщо вам потрібна робота з видами без xib, і IOS6, і IOS7


1

Я зробив це для відображення Retina / Non-Retina як

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

Наступне рішення працює досить добре в коді, не використовуючи магічні константи, і обліковий запис для користувача, який змінює клас розміру, наприклад, через обертання або додаткові додатки на ipads:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

Працює для швидкого 3 - In viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

Цей код: 1. Отримує висоту рядка стану 2. Надає верхній частині таблиці подання вмісту, що дорівнює висоті рядка стану. 3. Дає індикатору прокрутки однакову вставку, тому він відображається під рядком стану.


1

Для таких, як я, хто хотів би не вкласти їх UITableViewControllerу UIViewControllerспробу:

Спеціальний UITableViewControllerпідклас може додати перегляд маски до огляду tableView. Додайте маску в viewDidAppear і видаліть маску в viewWillDisappear.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

Я мав UISearchBar у верхній частині свого UITableView, і працювало наступне;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

Діліться та насолоджуйтесь ...


0

Я змусив його працювати, встановивши розмір у вільній формі

введіть тут опис зображення


2
"Модельовані показники" застосовуються лише до того, щоб ви бачили ваше творіння в Xcode, а не в реальності. [Див.: Stackoverflow.com/questions/16279379/…
Тайлер А.

0

Рішення Авраамчеса https://developer.apple.com/library/ios/qa/qa1797/_index.html працювало для мене наступним чином. У мене був єдиний контролер UITableview як мій початковий вигляд. Я спробував зсув коду та вбудовування в navcon, але не вирішив прозорості панелі стану.

Додайте контролер перегляду та зробіть його початковим поданням. Це повинно показати вам критичні посібники щодо верхніх і нижніх розміток.

Перетягніть старий Tableview у вигляд у новому контролері.

Виконайте все, щоб оновити таблицю в новий контролер:

Змініть ваш старий файл viewlleller.h на спадкування / підклас від UIViewController замість UITableViewController.

Додайте UITableViewDataSource та UITableViewDelegate до .hh контролера перегляду.

Повторно підключіть все необхідне на дошці розкадрування, наприклад, панелі пошуку.

Найголовніше - встановити обмеження, як у Apple Q&A. Я не намагався вставляти панель інструментів. Не визначена точна послідовність. Але червоний значок з’явився на путівниках макета, можливо, коли я будував. Я натиснув його і дозволив Xcode встановити / очистити обмеження.

Потім я клацнув усюди, поки не знайшов обмеження у вертикальному просторі і змінив його максимальне значення з -20 на 0, і воно працювало чудово.


0

Я використовую UISplitViewController з навігаційним контролером і контролером таблиці. Це спрацювало для мене в режимі перегляду після спроб багатьох рішень тут:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Це схоже на рішення Hot Licks, але застосовує підвід до навігаційного керування.


Це єдина відповідь, яка працювала на мене в iOS 8!
СамБ

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

Ось Swift 2.3. (Xcode 8.0) рішення. Я створив підклас UITableView.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

Вставка вмісту завжди повинна бути нульовою (за замовчуванням). Я встановлюю це Zero вручну. Ви також можете додати метод перевірки, який робить чек, і якщо це щось інше, ніж те, що ви хочете, щоб він був просто отримати правильну пряму. Зміна відображатиметься лише тоді, коли складається табличний перегляд (що трапляється не часто).

Не забудьте оновити TableView у своєму IB (у TableViewController або просто TableView у вашому ViewController).


0

Я зіткнувся з цим питанням на ios 11, але макет був правильним для ios 8 - 10.3.3. У моєму випадку я встановив вертикальне обмеження простору на Superview.Top Мардж замість Superview.Top, який працює для ios 8 - 11.

введіть тут опис зображення


0

Я знайшов найпростіший спосіб зробити це, особливо якщо ви додаєте подання таблиці всередині панелі вкладок - це спочатку додати подання, а потім додати перегляд таблиці всередині цього виду . Це дає вам найкращі орієнтири щодо маржі, які ви шукаєте.

введіть тут опис зображення


-1

перегляньте всі рішення: мій проект - просто використовувати xib, тому рішення з раскадровкой для мене не працює. self.edgesForExtendedLayout = UIRectEdgeNone; просто працює для контролера, якщо видно панель навігації. але якщо у вашого перегляду просто є рядок стану, це не працюватиме. тому я поєдную два умови.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

допомогти цьому працює.


-2

Якщо вам також потрібно підтримувати iOS 6, вам доведеться умовно перемістити її вниз. Тобто, в iOS 7 слід просто перемістити його на 20 очок (або через frameманіпуляції, або за допомогою автоматичного макета), а в iOS 6 - залишити його в спокої. Я не вірю, що ви можете це зробити в IB, тому вам доведеться це робити в коді.

EDIT

Насправді це можна зробити в IB, використовуючи дельти iOS6 / iOS7. Встановіть своє місце в iOS 7, потім для iOS 6 встановіть дельту Y на -20 балів. Дивіться це питання ТА для отримання додаткової інформації.


Якщо вимкнути кадр, на жаль, це не змінить.
Ніколас Сміт

Що з цим не працює? Перегляд таблиці не рухається вниз?
Скотт Берревоєць

Так, він залишається в тому ж положенні. Я спробував self.view.frameі self.tableView.frameв обох viewWillAppearі viewDidLoad. Щоб бути в безпеці, я також встановив setContentNeedsDisplayнеобхідність перемалювати.
Ніколас Сміт

Чи ввімкнено автоматичне розташування?
Скотт Берревоєць

Так, це авторозкладка та розгортка.
Ніколас Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.