簡體   English   中英

快速將NavigationBar底部邊框更改為虛線

[英]Change navigationBar bottom border to a dashed line in swift

我想將我的navigationBar更改為以虛線作為邊框,如下所示:

屏幕截圖

我在此線程中找到了關於如何更改NavigationBar邊框顏色的妙妙答案: 更改Swift導航條底部邊框的顏色特別是: https : //stackoverflow.com/a/46224261/436014

通過UIColor擴展:

extension UIColor {

    /// Converts this `UIColor` instance to a 1x1 `UIImage` instance and returns it.
    ///
    /// - Returns: `self` as a 1x1 `UIImage`.
    func as1ptImage() -> UIImage {
        UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
        setFill()
        UIGraphicsGetCurrentContext()?.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
        UIGraphicsEndImageContext()
        return image
    }
}

我想知道是否有任何方法可以改編虛線。 我當時以為可以通過以交替的顏色繪制填充來完成此操作,但由於它是單個UIcolor的擴展,因此感到困惑

navigationController.navigationBar.shadowImage = UIColor.black.as1ptImage()

因此,類似以下內容顯然不起作用:

UIGraphicsBeginImageContext(CGSize(width: 1, height: 4))
UIGraphicsGetCurrentContext()?.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
UIGraphicsGetCurrentContext()?.fill(CGRect(x: 1, y: 0, width: 3, height: 1))

我想知道是否有人知道如何解決這個問題

好的,我設法借助CALayer的API文檔找到了一個解決方案: https : //developer.apple.com/documentation/quartzcore/cashapelayer/1521921-linedashpattern

這個關於將CALayer轉換為UIImage的SO線程: iOS中來自CALayer的UIImage

整個過程是:

  1. 創建一個CALayer
  2. 給這個CALayer一個框架
  3. 畫一條虛線
  4. 轉換為UIImage
  5. 將此UIImage用作navigationBar.shadowImage

不錯的是,它可以適當地平鋪,因此CALayer / UIImage只需與您生成的虛線一樣寬即可。

    extension UIImage {
        class func imageWithLayer(layer: CALayer) -> UIImage {
            UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.isOpaque, 0.0)
            layer.render(in: UIGraphicsGetCurrentContext()!)
            guard let img = UIGraphicsGetImageFromCurrentImageContext() else { return UIImage() }
            UIGraphicsEndImageContext()
            return img
        }
    }


    let layer = CALayer()
    layer.frame = CGRect(x: 0, y: 0, width: 6, height: 1)
    let shapeLayer = CAShapeLayer()
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.lineWidth = 1
    shapeLayer.lineDashPattern = [4,2]
    let path = CGMutablePath()
    path.addLines(between: [CGPoint(x:1, y: 0), CGPoint(x: 6, y:0)])
    shapeLayer.path = path
    layer.addSublayer(shapeLayer)
    navigationController.navigationBar.shadowImage = UIImage.imageWithLayer(layer: layer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM