Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义UINavigationBar-设置内部高度更改的动画_Ios_Swift_Autolayout_Uinavigationbar_Intrinsic Content Size - Fatal编程技术网

Ios 自定义UINavigationBar-设置内部高度更改的动画

Ios 自定义UINavigationBar-设置内部高度更改的动画,ios,swift,autolayout,uinavigationbar,intrinsic-content-size,Ios,Swift,Autolayout,Uinavigationbar,Intrinsic Content Size,在这个特殊的场景中,我实际上非常困惑。我已经对UINavigationBar进行了子类化,注意到苹果过时的示例代码,我意识到sizeToFit永远不会被调用,并且会覆盖intrinsicContentSize和layoutSubviews来计算必要的高度。根据我提供的自定义视图计算高度时,一切都很好(我使用systemLayoutSizeFittingSize根据自定义内容视图/标题视图动态计算高度) 奇怪的是,当我尝试设置任何更改的动画时,我可以设置自定义标题视图中更改的动画,但是当通过inv

在这个特殊的场景中,我实际上非常困惑。我已经对UINavigationBar进行了子类化,注意到苹果过时的示例代码,我意识到sizeToFit永远不会被调用,并且会覆盖
intrinsicContentSize
layoutSubviews
来计算必要的高度。根据我提供的自定义视图计算高度时,一切都很好(我使用
systemLayoutSizeFittingSize
根据自定义内容视图/标题视图动态计算高度)

奇怪的是,当我尝试设置任何更改的动画时,我可以设置自定义
标题视图中更改的动画,但是当通过
invalidateIntrinsicContentSize()
重新加载intrinsicContentSize()时,图幅更改不会设置动画。它折断了

示例代码:

let delta = destinationTextFieldContainerView.frame.minX - originTextFieldContainerView.frame.minX + originTextFieldContainerView.frame.height
textContainersSeparatorConstraint.constant = -delta
UIView.animateWithDuration(2, delay: 2, options: UIViewAnimationOptions.CurveEaseIn, animations: {
    self.customContainerNavigationBar.invalidateIntrinsicContentSize()
    self.customContainerNavigationBar.layoutIfNeeded()

    }) { (_) in
        self.customContainerNavigationBar.invalidateIntrinsicContentSize()
}
一个约束值的更改将设置动画,但不幸的是(因为导航栏不依赖于自动布局),更新帧时似乎出现问题。我尝试在使固有大小无效之前直接更新帧,但没有成功。我还尝试了高度约束,在关键帧动画中以不同的时间偏移列出它,在不同的时间点使布局无效,但都没有成功。任何帮助都将不胜感激

可在此处找到调整大小代码:

override func intrinsicContentSize() -> CGSize {
    var navigationBarSize = super.intrinsicContentSize()
    navigationBarSize.width = superview?.frame.width ?? 0

    guard let  titleView = navigationItem?.titleView else {
        return navigationBarSize
    }
    let fittingSize = CGSize(width: navigationBarSize.width, height: UILayoutFittingCompressedSize.height)
    let titleViewSize = titleView.systemLayoutSizeFittingSize(fittingSize)

    navigationBarSize.height = max(titleViewSize.height, 44)

    navigationBarSize.width = UIViewNoIntrinsicMetric
    return navigationBarSize
}


override func layoutSubviews() {

    super.layoutSubviews()

    guard let navigationItem = navigationItem, titleView = navigationItem.titleView else {
        return
    }
    var navigationBarSize = bounds.size
    navigationBarSize.width = superview?.frame.width ?? 0

    var fittingSize = CGSize(width: navigationBarSize.width, height: UILayoutFittingCompressedSize.height)

    if let leftBarButtonItem = navigationItem.leftBarButtonItem, leftButtonCustomView = leftBarButtonItem.customView {
        fittingSize.width -= leftButtonCustomView.frame.width + leftButtonCustomView.frame.origin.x + 22
    }

    let titleViewSize = titleView.systemLayoutSizeFittingSize(fittingSize, withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityDefaultLow)

    titleView.frame = CGRect(origin: CGPoint(x: titleView.frame.origin.x, y: 0), size: titleViewSize)
    titleView.setNeedsLayout()
    titleView.layoutIfNeeded()

    if let leftBarButtonItem = navigationItem.leftBarButtonItem, leftButtonCustomView = leftBarButtonItem.customView {
        var customViewFrame = CGRect(origin: CGPoint.zero, size: navigationBarSize)

        let customViewSize = leftButtonCustomView.systemLayoutSizeFittingSize(customViewFrame.size, withHorizontalFittingPriority: UILayoutPriorityDefaultLow, verticalFittingPriority: UILayoutPriorityDefaultLow)
        customViewFrame.size = customViewSize
        leftButtonCustomView.frame = customViewFrame
        leftButtonCustomView.setNeedsLayout()
        leftButtonCustomView.layoutIfNeeded()
    }

    invalidateIntrinsicContentSize()

}