21

我下载了 Xcode 8 测试版并尝试使用 iMessages 应用程序扩展 sdk,但遇到了一个看似不标准的导航栏高度问题

当我过渡到应用程序的展开视图时,我的带有以下框架的图像CGRect(x: 0, y: 0, width: 100, height: 100)最终部分隐藏在导航栏后面。我希望它出现在导航栏下方。

我试过self.navigationController?.navigationBar.isTranslucent = false但没有用,我想这是有道理的,因为它超出了我的应用程序的控制范围。

有人玩过这个吗?我想避免两件事。简单地猜测适当的高度并远离程序化解决方案。 谢谢您的帮助袖珍的 展开

4

8 回答 8

15

像这样对顶部布局指南进行约束可能会有所帮助:

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
于 2016-08-19T23:03:02.247 回答
4

您可以从控制器的布局指南中获取高度:

self.topLayoutGuide.length

@Dilts 的演示之所以有效,是因为标签的顶部是顶部布局指南的约束。如果它们是对超级视图的约束,那么它也会在栏后面。

于 2016-08-04T13:21:38.747 回答
4

如果你和我一样仍然觉得Auto Layout很难用,那么你可以使用viewDidLayoutSubviews自动调整视图大小的方法。我有一个和你有同样问题的表格视图,所以我使用这个简单的方法来更改表格视图的顶部内容插图:

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

到目前为止,它在所有 iDevices 上都可以正常工作(纵向和横向)。

于 2016-09-20T13:35:31.903 回答
2

要回答您的问题:“超高导航栏的高度是多少”:

iMessage 应用扩展导航栏高度

它是 86 像素。

更新

关于隐藏 UI 的导航栏。我做了一个快速演示,没有任何问题。

在 y 位置 20 添加标签

我在视图顶部添加了几个标签(就在状态栏下方,y 点值为 20)。接下来,我添加了 2 个约束:左侧标签的前导空间和顶部空间以及右侧标签的尾随空间和顶部空间。

结果

这是我的结果,无论是紧凑模式还是扩展模式。所以只要确保你的组件低于 y-point-value 20 并且有一些限制,这样 Apple 就会为你调整视图大小!

于 2016-06-17T17:19:40.277 回答
1

如果将顶部布局指南设置为顶部约束,则它适用于 MSMessagesAppViewController。但它不适用于 UIViewControllers,因为布局指南不同。

除非您出于某种原因确实需要使用 UIViewController 类(例如:MessagesAppViewControllers 在包含 Obj C++ 代码时遇到问题),否则请坚持使用 MSMessagesAppViewController。

于 2016-09-20T04:55:05.183 回答
0

这是 Objective-C 中公认的答案

[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
于 2017-01-18T13:11:47.383 回答
0

截至目前使用 Xcode 8.2,上述解决方案都不适合我。@Dilts 答案仅适用于MessageViewController继承自MSMessagesAppViewController. 但是当我们尝试对继承自 的 ViewController 做同样的事情时UIViewController,这将不起作用。

我已经通过相对于视图而不是顶部布局指南绑定顶部约束来做到这一点。我将关于视图的顶部约束设置为零,并将该约束绑定为 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
        }

    }

在此处输入图像描述

紧凑模式

在此处输入图像描述

扩展模式

在此处输入图像描述

于 2017-05-11T13:48:27.457 回答
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]];
于 2017-06-17T00:04:29.293 回答