Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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_Overriding_Uinavigationbar_Draw - Fatal编程技术网

Ios UINavigationBar底部边框消失

Ios UINavigationBar底部边框消失,ios,swift,overriding,uinavigationbar,draw,Ios,Swift,Overriding,Uinavigationbar,Draw,我正在子类化UINavigationBar,在interface builder中,我使用Identity Inspector将其设置为我的UINavigationController的NavigationBar的类。问题是,当我重写draw方法时,navigationBar的下边框将消失。这是我的代码: class YC_NavigationBar: UINavigationBar { required init?(coder aDecoder: NSCoder) {

我正在子类化
UINavigationBar
,在interface builder中,我使用Identity Inspector将其设置为我的
UINavigationController的
NavigationBar
的类。问题是,当我重写draw方法时,
navigationBar
的下边框将消失。这是我的代码:

class YC_NavigationBar: UINavigationBar {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.backIndicatorImage = UIImage(named: "TopBar_Button_Back")!.withRenderingMode(.alwaysOriginal)
        self.backIndicatorTransitionMaskImage = UIImage(named: "TopBar_Button_Back")!.withRenderingMode(.alwaysOriginal)
        UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -200.0), for: .default)

    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        for i in self.subviews {
            if NSStringFromClass(i.classForCoder) == "_UINavigationBarContentView" {
                for j in i.subviews {
                    for constraint in j.constraints {
                        if constraint.firstAttribute == .leading && NSStringFromClass(constraint.firstItem!.classForCoder) == "_UIModernBarButton"  {
                            constraint.constant = 0
                            break
                        }
                    }
                    if NSStringFromClass(j.classForCoder) == "_UIButtonBarStackView" {
                        let ctr = NSLayoutConstraint(item: j, attribute: .trailing, relatedBy: .equal, toItem: i, attribute: .trailing, multiplier: 1, constant: 0)
                        i.addConstraint(ctr)
                    }
                }
                break
            }
        }
    }
}

仅仅通过重写该方法就发生了这样的事情,这太荒谬了。如何解决此问题?

这里有两个主要选项:

  • 自己画一条线,就像这样:

    override func draw(_ rect: CGRect) {
        super.draw(rect)
    
        // your other code here.
    
        if rect.maxY == self.bounds.maxY {
            if let context = UIGraphicsGetCurrentContext() {
                context.setStrokeColor(UIColor.red.cgColor)
                context.setLineWidth(1)
                context.move(to: CGPoint(x: 0, y: bounds.height))
                context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
                context.strokePath()
            }
        }
    }
    
  • 将子视图1px高度添加到Interface Builder中的栏中

  • 注意:不要在
    drawRect()
    方法中执行布局代码。有一个特定的覆盖点正是为了这个目的而存在的:

    open func layoutSubviews() // override point. called by layoutIfNeeded automatically. As of iOS 6.0, when constraints-based layout is used the base implementation applies the constraints-based layout, otherwise it does nothing.
    
    
        /* -layoutMargins returns a set of insets from the edge of the view's bounds that denote a default spacing for laying out content.
         If preservesSuperviewLayoutMargins is YES, margins cascade down the view tree, adjusting for geometry offsets, so that setting
         the left value of layoutMargins on a superview will affect the left value of layoutMargins for subviews positioned close to the
         left edge of their superview's bounds
           If your view subclass uses layoutMargins in its layout or drawing, override -layoutMarginsDidChange in order to refresh your 
         view if the margins change.
           On iOS 11.0 and later, please support both user interface layout directions by setting the directionalLayoutMargins property
         instead of the layoutMargins property. After setting the directionalLayoutMargins property, the values in the left and right
         fields of the layoutMargins property will depend on the user interface layout direction.
         */
    

    我尝试添加1倍高度的子视图,但我的应用程序在启动屏幕上冻结。但使用layoutSubview方法解决了我的问题。非常感谢你的帮助