iPhone X - Как мы должны обрабатывать пространство над заголовками разделов таблицы? Это видно по содержанию

У меня есть таблица с несколькими разделами и заголовками разделов для каждого раздела. Как вы знаете, заголовок раздела перемещается вместе с таблицей. Таким образом, если имеется более одного раздела, заголовок текущего раздела прикрепляется к верхней части табличного представления, а содержимое этого раздела прокручивается под заголовком.

Я пытаюсь понять, как это должно быть адаптировано для iPhone X, поскольку пространство над заголовком видно через содержимое, как вы заметили на этом снимке экрана. Я просмотрел представление Apple о том, как адаптироваться к выемке iPhone X, но все их примеры имели панель поиска вверху, поэтому они никогда не сталкивались с этой проблемой.

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


person sudoExclaimationExclaimation    schedule 26.09.2017    source источник
comment
Если приложение отображает строку состояния. Эта проблема будет решена по умолчанию.   -  person rptwsthi    schedule 26.09.2017
comment
@rptwsthi Не совсем, эта проблема будет решена, только если я покажу бесполезную панель навигации вверху, которая останется застрявшей. Но это в основном означает, что я трачу место на экране.   -  person sudoExclaimationExclaimation    schedule 26.09.2017
comment
Вы можете показать строку состояния.   -  person Torongo    schedule 26.09.2017
comment
Давно не играл с UIKit, но нет ли ограничения безопасной зоны   -  person Knight0fDragon    schedule 30.09.2017


Ответы (3)


Вот что я в итоге сделал.

Я добавил новый UIView (notchFIxView) с UIVisualEffectView внутри. Я разместил его в самом верху контроллера представления. Это самое верхнее представление за пределами всего табличного представления. Я прикрепил верхнее, левое и правое ограничения к супервизору (НЕ к безопасной зоне).

Я прикрепил нижнюю часть этого вида к верхней части безопасной зоны.

Я добавил в интерфейс протокол UIScrollViewDelegate и следующие макросы для обнаружения iPhoneX:

#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)

Я добавил в свой интерфейс переменную BOOL checkIfNotch; и инициализировал ее в viewDidLoad:

checkIfNotch = IS_IPHONE_X;

Затем окончательное отображение/скрытие notchFIxView происходит следующим образом:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (checkIfNotch) {
        static CGFloat lastY = 0;

        CGFloat currentY = scrollView.contentOffset.y;

        if ((lastY <= tableheaderviewHeight) && (currentY > tableheaderviewHeight)) {
            NSLog(@" ******* Header view just disappeared");

            self.notchFIxView.hidden=NO;
            [UIView animateWithDuration:0.3 animations:^{
                self.notchFIxView.alpha=1;
            } completion:^(BOOL finished) {

            }];

        }

        if ((lastY > tableheaderviewHeight) && (currentY <= tableheaderviewHeight)) {
            NSLog(@" ******* Header view just appeared");

            [UIView animateWithDuration:0.3 animations:^{
                self.notchFIxView.alpha=0;
            } completion:^(BOOL finished) {
                self.notchFIxView.hidden=YES;
            }];
        }

        lastY = currentY;
    }
}

После этого он выглядит намного красивее:

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

person sudoExclaimationExclaimation    schedule 30.09.2017
comment
Жестокий. Как это выглядит, не имеет значения. Есть правильный способ сделать это, он прост, вообще не требует кода, и все же вы не хотите этого делать. - person matt; 30.09.2017
comment
@matt Извините, я не понимаю, что не так на моем пути? Как выглядит ваш ответ, когда табличное представление вообще не прокручивается? Когда он на самом верху? Можете ли вы поделиться скриншотом этого? - person sudoExclaimationExclaimation; 30.09.2017
comment
Что не так с вашим способом, так это то, что это просто куча специальных хакерских махинаций. Существует простой правильный способ, который не требует кода, и именно его Apple предлагает вам сделать — вот почему они предоставили вам безопасную зону. Так почему бы не сделать это? - person matt; 30.09.2017
comment
То, как вы говорите о правильном, если я правильно понимаю, заключается в том, чтобы заставить верхнюю часть таблицы запускаться в безопасной области, а не в верхней части супервизора. Если я это сделаю, то вся область вокруг выемки станет черной, чего Apple не рекомендует в своих рекомендациях. Или я все еще неправильно понимаю ваш путь? - person sudoExclaimationExclaimation; 30.09.2017
comment
Вы уже нарушаете рекомендации по использованию контроллера табличного представления без панели навигации. Вы заметите, что ни одно из приложений Apple не делает этого. - person matt; 30.09.2017
comment
Нигде в своих рекомендациях по дизайну они не говорят, что не рекомендуют скрывать панель навигации. Панель навигации имела бы смысл, если бы у меня действительно был стек навигации. В моем приложении нет. Для игры тоже не имеет смысла показывать строку состояния. Однако для выемки они говорят: «Не пытайтесь скрыть закругленные углы устройства, корпус датчика или индикатор доступа к главному экрану, размещая черные полосы вверху и внизу экрана». - person sudoExclaimationExclaimation; 30.09.2017

так как пространство над заголовком видно через содержимое, как вы заметили на этом снимке экрана

Различайте две вещи: основной вид, который простирается за выемкой, и вид таблицы. Прикрепите верхнюю часть табличного представления к верхней части безопасной области. На iPhone X и только на iPhone X верхняя часть безопасной области будет находиться далеко внизу от верхней части основного вида, а нижняя часть безопасной области будет вверху снизу. основного вида, чтобы ваш вид таблицы не поднимался за выемку или не опускался за индикатор.

На этом снимке экрана над заголовком A прокручивается несколько ячеек, но вы их не видите. И нижняя часть таблицы остается за пределами индикатора виртуального дома.

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

Это просто вопрос предоставления контроллеру представления таблицы родительского контроллера представления с черным фоном. Вы можете сделать это в коде или настроить его полностью без кода в раскадровке.

person matt    schedule 26.09.2017
comment
Я думаю, вы неправильно поняли скриншот. Представление, которое вы видите за заголовком раздела, — это ячейка таблицы, которая была прокручена вверх. Ice — это одна из ячеек, как и Beach, Galaxy и т. д. Здесь нет основного вида, только табличный вид с заголовками разделов. - person sudoExclaimationExclaimation; 26.09.2017
comment
Я думаю, вы неправильно поняли мой ответ. Я говорю вам, что решение заключается в том, что вам нужны два представления, табличное представление, но основное представление за ним. - person matt; 26.09.2017
comment
Как выглядит ваш ответ, когда табличное представление вообще не прокручивается? Когда он на самом верху. Можете ли вы поделиться скриншотом этого? - person sudoExclaimationExclaimation; 30.09.2017
comment
Выглядит точно так же, но верхняя ячейка — Алабама; затем Аляска, затем Аризона (все они прокручиваются над заголовком на скриншоте). - person matt; 30.09.2017
comment
Что я ищу, так это то, что вы скрываете всю область выемки черным цветом? - person sudoExclaimationExclaimation; 30.09.2017
comment
Я ничего не скрываю. Наоборот, все выставлено напоказ. Это основной вид контроллера представления. Оно черное. Пожалуйста, сделайте глубокий вдох и попробуйте прочитать мой ответ. Это полностью объясняет. - person matt; 30.09.2017
comment
Я прочитал ваш ответ 3 раза. мой фон контроллера просмотра не черный, он выглядит темным, потому что симулятор, который я использую, не размывает правильно. Фон представляет собой UIVisualEffectView, который показывает сквозь размытие то, что позади. Если я начну табличное представление с безопасной области, а не с суперпредставления, то вверху оно будет выглядеть безвкусно, так как область вокруг выемки просто размыта, а при прокрутке содержимое табличного представления исчезнет еще до того, как дойдет до края экрана. . Это выглядит пошло. - person sudoExclaimationExclaimation; 30.09.2017
comment
То же самое с заголовками разделов, которые у меня есть - они на самом деле не черные, а размытый фон, скриншот симулятора выглядит черным. - person sudoExclaimationExclaimation; 30.09.2017
comment
Я не вижу, какое это имеет отношение к чему-либо. Но ладно, я сказал то, что должен был сказать. - person matt; 30.09.2017
comment
@NicholasFarmer Давайте придерживаться вашего нового вопроса, пожалуйста. - person matt; 13.08.2018

Если вам интересно, вы можете взглянуть на эту страницу github, которая дает вам возможность решить эту проблему с надрезом:

https://github.com/HarshilShah/NotchKit

person Azhar Ali    schedule 26.09.2017
comment
С этой страницы: PS: это было сделано в основном в шутку, когда я обсуждал различные способы обращения с iPhone X. Обновленные рекомендации Apple по человеческому интерфейсу для iPhone X прямо указывают на это: не маскируйте и не обращайте особое внимание на отображение клавиш. Особенности. Не пытайтесь скрыть закругленные углы устройства, корпус датчика или индикатор доступа к главному экрану, размещая черные полосы вверху и внизу экрана. Я не уверен, что нарушение HIG часто используется в качестве основания для отказа, однако я бы не стал спорить в любом случае. - person sudoExclaimationExclaimation; 26.09.2017