gpt4 book ai didi

iphone - UINavigationBar 色调颜色渐变

转载 作者:行者123 更新时间:2023-12-03 18:29:22 27 4
gpt4 key购买 nike

我想以编程方式更改 UINavigationBar 的 tintColor 并保持 Interface Builder 中的渐变。

当我在代码中更改 tintColor 时,渐变消失,但当我在 Interface Builder 中更改 tintColor 时,渐变会保留。

有什么想法吗?

最佳答案

所以这是一个老问题,但当我寻找听起来像这个问题但不同的东西时,我偶然发现了它。希望它能帮助其他人(或者其他人会向我展示更好的方法)...

如何在 UINavigationBar 上实现自定义渐变?

首先,让我们以通常的方式获取自定义渐变(作为 CALayer):

- (CALayer *)gradientBGLayerForBounds:(CGRect)bounds
{
CAGradientLayer * gradientBG = [CAGradientLayer layer];
gradientBG.frame = bounds;
gradientBG.colors = @[ (id)[[UIColor redColor] CGColor], (id)[[UIColor purpleColor] CGColor] ];
return gradientBG;
}

这样,渐变看起来像是朋克摇滚歌手的可疑化妆选择,这很好,因为此代码适用于假设的应用程序我的口袋里有一个品味可疑的朋克摇滚歌手。我的名字有点太长了..

现在我想把这个图层放在我的 UINavigationBar 上,这应该很容易吧?只需将其添加为子层即可,对吗?这里的问题是它会掩盖 UINavigationController 为您提供的精彩按钮和内容。这很糟糕。

相反,让我们看看 iOS5+ 中用于更改应用程序中所有 UINavigationBar 的外观的奇妙便捷方法:

[[UINavigationBar appearance] setBackgroundImage:SOME_IMAGE
forBarMetrics:UIBarMetricsDefault];

这里唯一的问题是我们没有 UIImage,我们有 CALayer。朋克摇滚爱好者应该做什么?

CALayer * bgGradientLayer = [self gradientBGLayerForBounds:ONE_OF_YOUR_NAV_CONTROLLERS.navigationBar.bounds];
UIGraphicsBeginImageContext(bgGradientLayer.bounds.size);
[bgGradientLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * bgAsImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

现在我们已经将 CALayer 转换为 UIImage(希望如此),所以剩下的就是设置它:

if (bgAsImage != nil)
{
[[UINavigationBar appearance] setBackgroundImage:bgAsImage
forBarMetrics:UIBarMetricsDefault];
}
else
{
NSLog(@"Failded to create gradient bg image, user will see standard tint color gradient.");
}

我喜欢这个解决方案的是

  • 我的应用中所有 UINavigationBar 的集中代码(在 AppDelegate 中)
  • 所有 UINavigation 按钮(后退、编辑等)仍会采用tintColor
  • 如果 UIImage 创建失败,我的 UINavigationBar 仍将遵循tintColor
  • 我不必依赖实际的图像资源/易于更新

但我仍然不相信这是最好的方法。因此,如果它对您有帮助,请享受它,如果可以的话,请告诉我如何改进它。

~谢谢

关于iphone - UINavigationBar 色调颜色渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/494982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com