Ответ 1
Это может помочь ограничить с помощью верхнего руководства по расположению:
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
Я загрузил бета-версию Xcode 8 и пытался играть с расширением sdk для приложений iMessages, но столкнулся с проблемой с их, казалось бы, нестандартной высотой навигационного барьера
когда я перехожу в расширенный вид приложения, мое изображение со следующим фреймом CGRect(x: 0, y: 0, width: 100, height: 100)
заканчивается частично скрытым за навигационной панелью. я бы хотел, чтобы он появился под панелью навигации.
Я попробовал self.navigationController?.navigationBar.isTranslucent = false
, но это не сработало, что, я думаю, имеет смысл, так как это из области моего приложения для контроля.
Кто-нибудь еще играл с этим? Я хочу избежать двух вещей. просто угадывая соответствующую высоту и уходя от программного решения.
спасибо за помощь
Это может помочь ограничить с помощью верхнего руководства по расположению:
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
Вы можете получить высоту из руководства по компоновке контроллера:
self.topLayoutGuide.length
Причина, по которой демонстрационная работа @Dilts работает, связана с тем, что верхняя часть ярлыков ограничивает верхний макет. Если это ограничение для супервизора, то оно также пойдет за панель.
Если вы похожи на меня и все еще считаете, что Auto Layout
сложно использовать, вы можете использовать метод viewDidLayoutSubviews
для автоматической настройки размера представления. У меня есть представление таблицы с той же проблемой, что и вы, поэтому я использовал этот простой метод для изменения вставки верхнего содержания таблицы:
-(void)viewDidLayoutSubviews {
[self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}
Пока он работает отлично (как в портретной, так и в альбомной ориентации) на всех iDevices.
Чтобы ответить на ваш вопрос: "какова высота дополнительного высотного навигатора":
Это 86px.
О навигаторе, скрывающем ваш пользовательский интерфейс. Я сделал быструю демонстрацию, и у меня не было проблем.
Я добавил пару ярлыков в верхнюю часть представления (только под строкой состояния, с у-значением 20). Затем я добавил 2 ограничения: ведущее пространство и верхнее пространство для левой метки и трейлинг-пространства и верхнее пространство для правой метки.
Это был мой результат, как в компактном режиме, так и в расширенном виде. Поэтому просто убедитесь, что вы поместите свои компоненты ниже значения y-point 20 и у вас есть некоторые ограничения. Таким образом, Apple предоставит вам изменение размера!
Если вы устанавливаете верхний макет в качестве верхнего ограничения, он работает для MSMessagesAppViewController. Но это не будет работать на UIViewControllers, потому что руководство по макете отличается.
Если вам действительно не нужно использовать класс UIViewController по какой-либо причине (например: MessagesAppViewControllers имеют проблемы с кодом Obj С++), придерживайтесь MSMessagesAppViewController.
Это принятый ответ в Objective-C
[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
На данный момент с 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
}
}
Компактный режим
Расширенный режим
[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]];