如何在UINavigationBarAppearance中设置阴影半径?

3

我正在尝试设置阴影半径,但是UINavigationBar Appearance没有这样的方法,只有shadowImage方法,它无法解决问题。

我需要在NavigationBar上制作一个阴影,使其略微更加明显。我已经能够设置其颜色,但无法设置其半径。我该怎么做?

代码本身:

struct ContentView: View {
    
    init() {
        let coloredAppearance = UINavigationBarAppearance()
        coloredAppearance.configureWithOpaqueBackground()
        coloredAppearance.shadowColor = .brown
        coloredAppearance.backgroundColor = .green
        coloredAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.black]
               
        UINavigationBar.appearance().standardAppearance = coloredAppearance
        UINavigationBar.appearance().scrollEdgeAppearance = coloredAppearance
    }
    
    
    var body: some View {
            NavigationView {
                Text("Screen")
                .navigationBarTitle("Test", displayMode: .large)
                }
            .navigationViewStyle(StackNavigationViewStyle())
            }
}

结果:enter image description here

如我们所见,阴影有颜色,但阴影本身太小了。

2个回答

1
在我的一些应用程序中,我使用自定义阴影图像,不知道是否有效。创建阴影图像时,请尝试增加高度值。
let shadowImage = UIColor(hexString: "#000000")
            .image(CGSize(width: 1, height: 1 / UIScreen.main.scale))

let coloredAppearance = UINavigationBarAppearance()
coloredAppearance.shadowImage = shadowImage

UINavigationBar.appearance().standardAppearance = coloredAppearance
UINavigationBar.appearance().scrollEdgeAppearance = coloredAppearance

谢谢!原来解决了这个问题! - undefined

0
@Luch,谢谢你的建议。我也不得不为这段代码痛苦地添加扩展。以下是最终可运行的代码示例:
    struct ContentView1: View {
    
    init() {
        let shadowColor = UIColor.init(hex: "#000000")
        let shadowImage = UIImage(color: shadowColor, size: CGSize(width: 1, height: 9 / UIScreen.main.scale))
        let alphaImage = shadowImage?.withAlpha(0.5)
        
        let coloredAppearance = UINavigationBarAppearance()
        coloredAppearance.backgroundColor = .green
        coloredAppearance.shadowImage = alphaImage
        coloredAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.black]

        UINavigationBar.appearance().standardAppearance = coloredAppearance
        UINavigationBar.appearance().scrollEdgeAppearance = coloredAppearance
    }
    
    
    var body: some View {
            NavigationView {
                Text("Screen")
                .navigationBarTitle("Test", displayMode: .large)
                }
            .navigationViewStyle(StackNavigationViewStyle())
            }
}

struct StackOver_Previews: PreviewProvider {
    static var previews: some View {
        ContentView1()
    }
}

// create UIcolor by hex
extension UIColor {
    public convenience init(hex:String) {
        var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
        
        if (cString.hasPrefix("#")) {
            cString.remove(at: cString.startIndex)
        }
        var r: CGFloat = 0.0
        var g: CGFloat = 0.0
        var b: CGFloat = 0.0
        var a: CGFloat = 1.0
        
        var rgbValue:UInt64 = 0
        Scanner(string: cString).scanHexInt64(&rgbValue)
        
        if ((cString.count) == 8) {
            r = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
            g =  CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
            b = CGFloat((rgbValue & 0x0000FF)) / 255.0
            a = CGFloat((rgbValue & 0xFF000000)  >> 24) / 255.0
            
        }else if ((cString.count) == 6){
            r = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
            g =  CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
            b = CGFloat((rgbValue & 0x0000FF)) / 255.0
            a =  CGFloat(1.0)
        }
        
        
        self.init(  red: r,
                    green: g,
                    blue: b,
                    alpha: a
        )
    } }

// create image by Color
public extension UIImage {
    convenience init?(color: UIColor, size: CGSize) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}

// just for setting alpha
extension UIImage {
    
    func withAlpha(_ alpha: CGFloat) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { _ in
            draw(at: .zero, blendMode: .normal, alpha: alpha)
        }
    }
}

结果:在此输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接