使用自定义背景图像摆脱 UINavigationBar 上的 1px 阴影
Getting rid of 1px shadow on UINavigationBar with custom background image
我正在制作一个自定义 UINavigationBar
,其顶部栏图像具有黑色渐变。我怎样才能消除底部这个 1px 的阴影边框?
我尝试了一些我在此处找到的代码,但它在我的设备上不起作用,只能在模拟器上运行。这是我试过的代码。
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named:"TripNavigationBar2.png"), forBarPosition: .Any, barMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
}
放在viewDidAppear:
里也没用。
谁能解释一下为什么以及如何解决这个问题?
可能最简单的事情是将 UIImage 分配给导航栏的 -shadowImage
属性。
我还是不知道 swift 所以我用 objC 写 :
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
使用那种方法,你是说每个导航栏都应该应用一个空图像作为 shadowImage。
真的很奇怪,它不起作用,你有没有用那个方法?我一般在app delegate中调用didFinishLauching。
您也可以尝试从清晰的颜色创建一个 1px 的正方形图像并将其添加为阴影图像。这是使这成为可能的方法。
+ (UIImage *) imageWithColor:(UIColor*) color {
CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return colorImage;
}
这应该适合你:
self.navigationController?.navigationBar.clipsToBounds
可能是半透明的原因属性。
默认值为是。
[self.navigationController.navigationBar setTranslucent:NO];
试一试,希望对你有帮助。
我在具有 UIImage 背景的 iPad Air 上遇到了类似的问题,它在左侧留下了 1px 的线。我可以通过将 UIView 的背景颜色设置为像红色这样响亮的颜色来判断它是 UIImage。由于某种原因,UIImage 没有正确填充完整图像。
在我的例子中,只有当我使用的图像与放置在其中的视图的像素大小完全匹配时才会发生。为了解决这个问题,我编辑了图像并将其重新保存回相同的分辨率。不知何故,这为我解决了这个问题。完全不知道为什么,取景器在我编辑之前指出图像是正确的分辨率。
一个远景,但如果您的图像恰好是 iPhone 6 的高度、宽度或两者的像素完美尺寸,我认为值得一提。
我刚刚注意到 xcode 有一个新的调试工具,用于查看在 3D 中展开的视图层次结构。假设模拟器显示您的问题,此调试工具可能有助于准确定位线路的来源。似乎仅在 iOS8 中的 运行 时有效。
你的代码完全没问题。
问题出在您使用的背景图片上。您要么没有 @2x
变体,要么没有将其添加到项目中。当仅在 iPhone 5s 的示例项目中使用您的图像时,我可以重现该问题。我将您的图像的大小调整后的变体添加到项目后,问题就消失了:
如果将该图像添加到名为 TripNavigationBar2@2x.png
的项目中,问题应该会消失。
为了完整起见,我使用了 UIImage(named:"TripNavigationBar2")
(没有 .png
后缀),但这应该没什么区别。
我正在制作一个自定义 UINavigationBar
,其顶部栏图像具有黑色渐变。我怎样才能消除底部这个 1px 的阴影边框?
我尝试了一些我在此处找到的代码,但它在我的设备上不起作用,只能在模拟器上运行。这是我试过的代码。
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named:"TripNavigationBar2.png"), forBarPosition: .Any, barMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
}
放在viewDidAppear:
里也没用。
谁能解释一下为什么以及如何解决这个问题?
可能最简单的事情是将 UIImage 分配给导航栏的 -shadowImage
属性。
我还是不知道 swift 所以我用 objC 写 :
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
使用那种方法,你是说每个导航栏都应该应用一个空图像作为 shadowImage。
真的很奇怪,它不起作用,你有没有用那个方法?我一般在app delegate中调用didFinishLauching。
您也可以尝试从清晰的颜色创建一个 1px 的正方形图像并将其添加为阴影图像。这是使这成为可能的方法。
+ (UIImage *) imageWithColor:(UIColor*) color {
CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return colorImage;
}
这应该适合你:
self.navigationController?.navigationBar.clipsToBounds
可能是半透明的原因属性。
默认值为是。
[self.navigationController.navigationBar setTranslucent:NO];
试一试,希望对你有帮助。
我在具有 UIImage 背景的 iPad Air 上遇到了类似的问题,它在左侧留下了 1px 的线。我可以通过将 UIView 的背景颜色设置为像红色这样响亮的颜色来判断它是 UIImage。由于某种原因,UIImage 没有正确填充完整图像。
在我的例子中,只有当我使用的图像与放置在其中的视图的像素大小完全匹配时才会发生。为了解决这个问题,我编辑了图像并将其重新保存回相同的分辨率。不知何故,这为我解决了这个问题。完全不知道为什么,取景器在我编辑之前指出图像是正确的分辨率。
一个远景,但如果您的图像恰好是 iPhone 6 的高度、宽度或两者的像素完美尺寸,我认为值得一提。
我刚刚注意到 xcode 有一个新的调试工具,用于查看在 3D 中展开的视图层次结构。假设模拟器显示您的问题,此调试工具可能有助于准确定位线路的来源。似乎仅在 iOS8 中的 运行 时有效。
你的代码完全没问题。
问题出在您使用的背景图片上。您要么没有 @2x
变体,要么没有将其添加到项目中。当仅在 iPhone 5s 的示例项目中使用您的图像时,我可以重现该问题。我将您的图像的大小调整后的变体添加到项目后,问题就消失了:
如果将该图像添加到名为 TripNavigationBar2@2x.png
的项目中,问题应该会消失。
为了完整起见,我使用了 UIImage(named:"TripNavigationBar2")
(没有 .png
后缀),但这应该没什么区别。