UINavigationItem 标题视图的框架

Posted

技术标签:

【中文标题】UINavigationItem 标题视图的框架【英文标题】:Frame for UINavigationItem Title View 【发布时间】:2017-04-26 15:39:32 【问题描述】:

我想复制 ios 消息的标题栏标题视图在应用程序中的行为方式。 (特别是它在后退按钮和信息按钮之间动态调整内容的位置)。

我的方法是在一个 nib 中创建一个自定义视图来保存我的可视元素数据,并将这些视图放在一个堆栈视图中,然后使该堆栈视图成为我导航项的自定义标题视图。

在堆栈视图上使用子视图 init 会产生一个结果,该结果只是将它的每个子视图叠加在一起。使用帧初始化器会为其提供一个静态帧。

我想尝试获取条形按钮项的框架,但如果可用的话,我想要一种更无缝、自动布局风格的实现方式。

我希望它能够成为每个条形按钮项目之间的最大宽度。

这就是我现在正在使用的(来自viewDidAppear):

    let frame = CGRect(x: 0, y: 0, width: 40, height: 58)
    let aView = ConversationPartyView(frame: frame)
    aView.avatar.backgroundColor = UIColor.gray
    aView.name.text = "Kirk"
    let bView = ConversationPartyView(frame: frame)
    bView.avatar.backgroundColor = UIColor.red
    bView.name.text = "Spock"
    let stack = UIStackView(arrangedSubviews: [aView, bView])
    stack.axis = .horizontal
    navigationBar.topItem?.titleView = stack

【问题讨论】:

【参考方案1】:

使用UIStackView 时,您不再可以控制视图的框架。相反,您的 View 类应该覆盖 intrinsicContentSize 以证明其内容的大小合适,而 UIStackView 将处理其余部分。

您也可以根据需要调整UIStackViewdistributionspacing

【讨论】:

我明白你在说什么,但是当我给它的 frame 属性一个值时,堆栈视图似乎表现正确,我认为我的问题是需要为堆栈视图本身获取一个动态框架。至少要足够宽以占据栏按钮项之间的空间。 啊,我想看看你在问什么。您的 StackView 不是替换导航栏,而是替换为 titleView。并且您希望它根据条形按钮和旋转水平调整其框架? 就是这样。

以上是关于UINavigationItem 标题视图的框架的主要内容,如果未能解决你的问题,请参考以下文章

为 UINavigationItem 的 titleView 设置视图控制器

推送新视图时 UINavigationItem TitleView 崩溃

UINavigationItem 提示动画问题

UINavigationController 和 UINavigationItem

UINavigationItem 后退按钮返回到上一个导航项,但视图没有改变

SearchBar 处于活动状态时会超出 UINavigationItem 框架