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

Расширение приложения iOS 10 iOS 10: как вычислить высоту добавочного высотного навигатора

Я загрузил бета-версию Xcode 8 и пытался играть с расширением sdk для приложений iMessages, но столкнулся с проблемой с их, казалось бы, нестандартной высотой навигационного барьера

когда я перехожу в расширенный вид приложения, мое изображение со следующим фреймом CGRect(x: 0, y: 0, width: 100, height: 100) заканчивается частично скрытым за навигационной панелью. я бы хотел, чтобы он появился под панелью навигации.

Я попробовал self.navigationController?.navigationBar.isTranslucent = false, но это не сработало, что, я думаю, имеет смысл, так как это из области моего приложения для контроля.

Кто-нибудь еще играл с этим? Я хочу избежать двух вещей. просто угадывая соответствующую высоту и уходя от программного решения. compact расширенный спасибо за помощь

4b9b3361

Ответ 1

Это может помочь ограничить с помощью верхнего руководства по расположению:

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true

Ответ 2

Вы можете получить высоту из руководства по компоновке контроллера:

self.topLayoutGuide.length

Причина, по которой демонстрационная работа @Dilts работает, связана с тем, что верхняя часть ярлыков ограничивает верхний макет. Если это ограничение для супервизора, то оно также пойдет за панель.

Ответ 3

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

-(void)viewDidLayoutSubviews {
    [self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}

Пока он работает отлично (как в портретной, так и в альбомной ориентации) на всех iDevices.

Ответ 4

Чтобы ответить на ваш вопрос: "какова высота дополнительного высотного навигатора":

iMessage App Extension NavBar height

Это 86px.

UPDATE

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

Добавлены метки в позиции y 20

Я добавил пару ярлыков в верхнюю часть представления (только под строкой состояния, с у-значением 20). Затем я добавил 2 ограничения: ведущее пространство и верхнее пространство для левой метки и трейлинг-пространства и верхнее пространство для правой метки.

Результат

Это был мой результат, как в компактном режиме, так и в расширенном виде. Поэтому просто убедитесь, что вы поместите свои компоненты ниже значения y-point 20 и у вас есть некоторые ограничения. Таким образом, Apple предоставит вам изменение размера!

Ответ 5

Если вы устанавливаете верхний макет в качестве верхнего ограничения, он работает для MSMessagesAppViewController. Но это не будет работать на UIViewControllers, потому что руководство по макете отличается.

Если вам действительно не нужно использовать класс UIViewController по какой-либо причине (например: MessagesAppViewControllers имеют проблемы с кодом Obj С++), придерживайтесь MSMessagesAppViewController.

Ответ 6

Это принятый ответ в Objective-C

[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;

Ответ 7

На данный момент с Xcode 8.2 ни одно из вышеперечисленных решений для меня не работает. Ответ @Dilts будет работать только для MessageViewController, который наследуется от MSMessagesAppViewController. Но когда мы пытаемся сделать то же самое с нашим ViewController, который наследуется от UIViewController, тогда это не сработает.

Я делаю это, привязывая Top Constraint к представлению, а не к руководству Top Layout. Я устанавливаю верхнее ограничение в ноль относительно представления и связывает это ограничение как topLayout.

@IBOutlet weak var topLayout: NSLayoutConstraint!

И затем программно изменить значение ограничения при изменении стиля презентации.

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
        // Called before the extension transitions to a new presentation style.

        if presentationStyle == .compact{
            mediaViewController?.topLayout.constant = 0.0
        }else{

            mediaViewController?.topLayout.constant = 86.0
        }

    }

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

Компактный режим

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

Расширенный режим

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

Ответ 8

    [self.view addConstraints: [NSArray arrayWithObjects:

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeTop
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.topLayoutGuide
                                                         attribute:NSLayoutAttributeBottom
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeBottom
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.bottomLayoutGuide
                                                         attribute:NSLayoutAttributeTop
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeLeft
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:[self view]
                                                         attribute:NSLayoutAttributeLeft
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeRight
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:[self view]
                                                         attribute:NSLayoutAttributeRight
                                                        multiplier:1.0
                                                          constant:0.0], nil]];