繁体   English   中英

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

[英]How to set shadow radius in UINavigationBarAppearance?

我正在尝试设置阴影半径,但是 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())
            }
}

结果: 在此处输入图像描述

我们可以看到,阴影是有颜色的,但是阴影本身太小了。

在我的一些应用程序中,我使用自定义阴影图像,不知道它是否会起作用。 创建阴影图像时尝试增加高度值

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

@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)
        }
    }
}

结果: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM