• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - UINavigationBar 底部边框消失

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:08:52 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我是 UINavigationBar 的子类,在界面构建器中我使用 Identity Inspector 将其设置为 UINavigationControllerNavigationBar 的类>。问题是,当我覆盖 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
            }
        }
    }
}

仅通过覆盖该方法就会发生这种情况真是太荒谬了。我该如何解决这个问题?



Best Answer-推荐答案


这里有两个主要选择:

  1. 像这样自己画一条线:

    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()
            }
        }
    }
    
  2. 在 Interface Builder 的 bar 中添加一个 1px 高度的 subview 。

附:不要在 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.
     */

关于ios - UINavigationBar 底部边框消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50247387/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap