Szy*_*zur 422 objective-c uinavigationbar ipad ios swift
我有一个应用程序,有时需要其导航栏与内容融为一体.
有谁知道如何摆脱或改变这个讨厌的小酒吧的颜色?
在下面的图像我有 - 我正在谈论"根视图控制器"下面这个1px高度线
Ser*_*nko 687
为此,您应该设置自定义阴影图像.但是要显示阴影图像,您还需要设置自定义背景图像,引用Apple的文档:
要显示自定义阴影图像,还必须使用setBackgroundImage(_:for :)方法设置自定义背景图像.如果使用默认背景图像,则无论此属性的值如何,都将使用默认阴影图像.
所以:
let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
for: .default)
navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)
以上是隐藏它的唯一"官方"方式.不幸的是,它消除了酒吧的半透明度.
你有这些选择:
纯色,无透明度:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)创建填充颜色的小背景图像并使用它.
使用下面描述的'hacky'方法.它还会保持酒吧半透明.
为了保持半透明,你需要另一种方法,它看起来像一个黑客,但运作良好.我们试图删除的阴影是在.shadowColor
某处的发际线UIImageView
.我们可以找到它并在需要时隐藏/显示它.
下面的说明假设您只需要在UINavigationBar
层次结构的一个控制器中隐藏发际线.
声明实例变量:
private var shadowImageView: UIImageView?
Run Code Online (Sandbox Code Playgroud)添加找到这个阴影的方法(发际线) UINavigationController
private func findShadowImage(under view: UIView) -> UIImageView? {
if view is UIImageView && view.bounds.size.height <= 1 {
return (view as! UIImageView)
}
for subview in view.subviews {
if let imageView = findShadowImage(under: subview) {
return imageView
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)添加/编辑UIImageView:
方法:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if shadowImageView == nil {
shadowImageView = findShadowImage(under: navigationController!.navigationBar)
}
shadowImageView?.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
shadowImageView?.isHidden = false
}
Run Code Online (Sandbox Code Playgroud)相同的方法也适用于viewWillAppear/viewWillDisappear
发际线,(几乎)你需要隐藏的任何其他东西:)
非常感谢@Leo Natan最初的想法!
Vis*_*han 218
以下可以帮助简单!
迅速:
self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
Run Code Online (Sandbox Code Playgroud)
目标C:
[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
Run Code Online (Sandbox Code Playgroud)
Ric*_*oor 144
如果您只想使用实心导航栏颜色并在故事板中进行设置,请在AppDelegate
班级中使用此代码通过外观代理删除1像素边框:
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
forBarPosition:UIBarPositionAny
barMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
Run Code Online (Sandbox Code Playgroud)
nul*_*ull 96
试试这个:
[[UINavigationBar appearance] setBackgroundImage: [UIImage new]
forBarMetrics: UIBarMetricsDefault];
[UINavigationBar appearance].shadowImage = [UIImage new];
Run Code Online (Sandbox Code Playgroud)
下面的图片有解释(iOS7 NavigationBar):
并检查这个问题: iOS7 - 更改UINavigationBar边框颜色
pxp*_*ics 62
想要添加Swift版本的Serhii的答案.我创建了UIBarExtension.swift
以下内容:
import Foundation
import UIKit
extension UINavigationBar {
func hideBottomHairline() {
self.hairlineImageView?.isHidden = true
}
func showBottomHairline() {
self.hairlineImageView?.isHidden = false
}
}
extension UIToolbar {
func hideBottomHairline() {
self.hairlineImageView?.isHidden = true
}
func showBottomHairline() {
self.hairlineImageView?.isHidden = false
}
}
extension UIView {
fileprivate var hairlineImageView: UIImageView? {
return hairlineImageView(in: self)
}
fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
return imageView
}
for subview in view.subviews {
if let imageView = self.hairlineImageView(in: subview) { return imageView }
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
Osc*_*VGG 60
快速做到这一点:
UINavigationBar.appearance().setBackgroundImage(
UIImage(),
forBarPosition: .Any,
barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)
Jak*_*ůša 19
快速简单的解决方案
let navigationBar = self.navigationController?.navigationBar
navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
navigationBar?.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)
sam*_*ize 16
在研究了Serhil的答案后,我创建了一个可以轻松隐藏发际线的吊舱UINavigationBar + Addition.
#import "UINavigationBar+Addition.h"
- (void)viewDidLoad {
[super viewDidLoad];
UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar hideBottomHairline];
}
Run Code Online (Sandbox Code Playgroud)
小智 14
在Swift 3.0中
AppDelegate.swift
通过将以下代码添加到应用程序功能来编辑您的:
// Override point for customization after application launch.
// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
Run Code Online (Sandbox Code Playgroud)
tf.*_*ves 11
针对Swift 2.0更新了pxpgraphics的解决方案
extension UINavigationBar {
func hideBottomHairline()
{
hairlineImageViewInNavigationBar(self)?.hidden = true
}
func showBottomHairline()
{
hairlineImageViewInNavigationBar(self)?.hidden = false
}
private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
{
if let imageView = view as? UIImageView where imageView.bounds.height <= 1
{
return imageView
}
for subview: UIView in view.subviews
{
if let imageView = hairlineImageViewInNavigationBar(subview)
{
return imageView
}
}
return nil
}
}
extension UIToolbar
{
func hideHairline()
{
let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
}
func showHairline()
{
let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
}
private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
{
if let imageView = view as? UIImageView where imageView.bounds.height <= 1
{
return imageView
}
for subview: UIView in view.subviews
{
if let imageView = hairlineImageViewInToolbar(subview)
{
return imageView
}
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
Far*_*med 11
Swift 4 //用于隐藏导航栏阴影线
navigationController?.navigationBar.shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)
glo*_*cha 11
从iOS 13开始,有一个系统API可以设置或删除阴影
UIKit使用shadowImage和shadowColor属性确定阴影的外观。当shadowImage为nil时,该条显示根据shadowColor属性中的值着色的默认阴影。如果shadowColor为nil或包含clearColor颜色,则该条不显示阴影。
let appearance = UINavigationBarAppearance()
appearance.shadowImage = nil
appearance.shadowColor = nil
navigationController.navigationBar.standardAppearance = appearance
Run Code Online (Sandbox Code Playgroud)
Alv*_*ivi 10
我使用UINavigationBar扩展,使我能够使用UIAppearance API隐藏/显示阴影,或选择使用Storyboard(或源代码)隐藏/显示阴影的导航栏.这是扩展名:
import UIKit
private var flatAssociatedObjectKey: UInt8 = 0
/*
An extension that adds a "flat" field to UINavigationBar. This flag, when
enabled, removes the shadow under the navigation bar.
*/
@IBDesignable extension UINavigationBar {
@IBInspectable var flat: Bool {
get {
guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
return false
}
return obj.boolValue;
}
set {
if (newValue) {
let void = UIImage()
setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
shadowImage = void
} else {
setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
shadowImage = nil
}
objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,要禁用所有导航栏上的阴影,您必须使用:
UINavigationBar.appearance().flat = true
Run Code Online (Sandbox Code Playgroud)
或者您可以使用故事板启用/禁用此行为:
Cha*_*lva 10
适用于 iOS 13+
诀窍是用'UINavigationBarAppearance'
初始化TransparentBackground
。然后您可以轻松删除导航栏的水平线。
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
appearance.backgroundColor = .green // Required background color
Run Code Online (Sandbox Code Playgroud)
最后,按照苹果的建议将外观更改添加到导航项。
self.navigationItem.standardAppearance = appearance
self.navigationItem.scrollEdgeAppearance = appearance
self.navigationItem.compactAppearance = appearance
Run Code Online (Sandbox Code Playgroud)
Swift 4测试了 一线解决方案
在Viewdidload()
设置导航控制器的用户默认值true为键"hidesShadow"
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
}
Run Code Online (Sandbox Code Playgroud)
如果您想保留半透明度并且不想UINavigationController
在应用程序中创建每个子类,则另一个选项是:
#import <objc/runtime.h>
@implementation UINavigationController (NoShadow)
+ (void)load {
Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
method_exchangeImplementations(original, swizzled);
}
+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
return (UIImageView *)view;
}
for (UIView *subview in view.subviews) {
UIImageView *imageView = [self findHairlineImageViewUnder:subview];
if (imageView) {
return imageView;
}
}
return nil;
}
- (void)swizzled_viewWillAppear:(BOOL)animated {
UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
shadow.hidden = YES;
[self swizzled_viewWillAppear:animated];
}
@end
Run Code Online (Sandbox Code Playgroud)
斯威夫特把这个
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: .Any, barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()
Run Code Online (Sandbox Code Playgroud)
在
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
Run Code Online (Sandbox Code Playgroud)
Slightly Swift Solution
func setGlobalAppearanceCharacteristics () {
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.tintColor = UIColor.white
navigationBarAppearace.barTintColor = UIColor.blue
navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
navigationBarAppearace.shadowImage = UIImage()
}
Run Code Online (Sandbox Code Playgroud)
Swift 4.2中的解决方案:
private func removeHairlineFromNavbar() {
UINavigationBar.appearance().setBackgroundImage(
UIImage(),
for: .any,
barMetrics: .default)
UINavigationBar.appearance().shadowImage = UIImage()
}
Run Code Online (Sandbox Code Playgroud)
只需将此函数放在第一个Viewcontroller上并调用 viewdidload
小智 5
对我有用的两行解决方案。尝试在 ViewDidLoad 方法中添加:
navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
167310 次 |
最近记录: |