iOS 10 iMessage 应用程序扩展:如何计算超高导航栏的高度
iOS 10 iMessage app extension: how do i calculate the height of the extra tall navbar
我下载了 Xcode 8 beta 并尝试使用 iMessages 应用程序扩展 sdk,但 运行 遇到了一个问题,它们的导航栏高度看似不标准
当我运行进入应用程序的展开视图时,带有以下框架的图像 CGRect(x: 0, y: 0, width: 100, height: 100)
最终部分隐藏在导航栏后面。我希望它显示在导航栏下方。
我试过 self.navigationController?.navigationBar.isTranslucent = false
但它没有用,我想这是有道理的,因为它超出了我的应用程序的控制范围。
有人玩过这个吗?我想避免两件事。简单地猜测合适的高度并远离程序化解决方案。
感谢帮助
回答您的问题:“超高导航栏的高度是多少”:
是86px。
更新
关于隐藏您的导航栏 UI。我做了一个快速演示,没有遇到任何问题。
我在视图顶部添加了几个标签(就在状态栏下方,y 点值为 20 处)。接下来,我添加了 2 个约束:Leading space 和 Top Space 用于左侧标签,Trailing space 和 Top Space 用于右侧标签。
这是我的结果,包括紧凑模式和扩展模式。所以只要确保你把你的组件放在 y 点值 20 以下并有一些限制,这样 Apple 就会为你调整视图大小!
您可以从控制器的布局指南中获取高度:
self.topLayoutGuide.length
@Dilts 的演示之所以有效,是因为标签的顶部受顶部布局指南的约束。如果他们对超级视图有约束,那么它也会落在后面。
像这样对顶部布局指南进行约束可能会有所帮助:
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
如果将顶部布局指南设置为顶部约束,它适用于 MSMessagesAppViewController。但它不适用于 UIViewControllers,因为布局指南不同。
除非您出于某种原因确实需要使用 UIViewController class(例如:MessagesAppViewControllers 在包含 Obj C++ 代码时遇到问题),否则请坚持使用 MSMessagesAppViewController。
如果你和我一样,还是觉得Auto Layout
不好用,那你可以用viewDidLayoutSubviews
的方法来自动调整视图大小。我有一个 table 视图和你有同样的问题,所以我使用这个简单的方法来更改 table 视图的顶部内容插图:
-(void)viewDidLayoutSubviews {
[self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}
到目前为止它在所有 iDevices 上都运行良好(纵向和横向)。
这是 Objective-C
中接受的答案
[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
截至目前 Xcode 8.2,上述解决方案的 none 对我有效。
@Dilts 答案仅适用于继承自 MSMessagesAppViewController
的 MessageViewController
。但是当我们尝试对继承自 UIViewController
的 ViewController 执行相同操作时,这将不起作用。
我是通过将顶部约束绑定到视图而不是顶部布局指南来做到这一点的。我将关于视图的顶部约束设置为零,并将该约束绑定为 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]];
我下载了 Xcode 8 beta 并尝试使用 iMessages 应用程序扩展 sdk,但 运行 遇到了一个问题,它们的导航栏高度看似不标准
当我运行进入应用程序的展开视图时,带有以下框架的图像 CGRect(x: 0, y: 0, width: 100, height: 100)
最终部分隐藏在导航栏后面。我希望它显示在导航栏下方。
我试过 self.navigationController?.navigationBar.isTranslucent = false
但它没有用,我想这是有道理的,因为它超出了我的应用程序的控制范围。
有人玩过这个吗?我想避免两件事。简单地猜测合适的高度并远离程序化解决方案。
回答您的问题:“超高导航栏的高度是多少”:
是86px。
更新
关于隐藏您的导航栏 UI。我做了一个快速演示,没有遇到任何问题。
我在视图顶部添加了几个标签(就在状态栏下方,y 点值为 20 处)。接下来,我添加了 2 个约束:Leading space 和 Top Space 用于左侧标签,Trailing space 和 Top Space 用于右侧标签。
这是我的结果,包括紧凑模式和扩展模式。所以只要确保你把你的组件放在 y 点值 20 以下并有一些限制,这样 Apple 就会为你调整视图大小!
您可以从控制器的布局指南中获取高度:
self.topLayoutGuide.length
@Dilts 的演示之所以有效,是因为标签的顶部受顶部布局指南的约束。如果他们对超级视图有约束,那么它也会落在后面。
像这样对顶部布局指南进行约束可能会有所帮助:
view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
如果将顶部布局指南设置为顶部约束,它适用于 MSMessagesAppViewController。但它不适用于 UIViewControllers,因为布局指南不同。
除非您出于某种原因确实需要使用 UIViewController class(例如:MessagesAppViewControllers 在包含 Obj C++ 代码时遇到问题),否则请坚持使用 MSMessagesAppViewController。
如果你和我一样,还是觉得Auto Layout
不好用,那你可以用viewDidLayoutSubviews
的方法来自动调整视图大小。我有一个 table 视图和你有同样的问题,所以我使用这个简单的方法来更改 table 视图的顶部内容插图:
-(void)viewDidLayoutSubviews {
[self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}
到目前为止它在所有 iDevices 上都运行良好(纵向和横向)。
这是 Objective-C
中接受的答案[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
截至目前 Xcode 8.2,上述解决方案的 none 对我有效。
@Dilts 答案仅适用于继承自 MSMessagesAppViewController
的 MessageViewController
。但是当我们尝试对继承自 UIViewController
的 ViewController 执行相同操作时,这将不起作用。
我是通过将顶部约束绑定到视图而不是顶部布局指南来做到这一点的。我将关于视图的顶部约束设置为零,并将该约束绑定为 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]];