如何在导航栏的默认后退按钮上设置图像

时间:2015-06-10 13:41:32

标签: ios objective-c

我使用Appdelegate中的以下代码在所有视图控制器的导航栏上设置按钮图像:

    [self.navigationItem.backBarButtonItem setBackButtonBackgroundImage:newimage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

现在在我的一个视图控制器中,我从图库中选择一个新图像并保存。我希望只要我保存这个新图像,后退按钮的“图像”就会被这个'newimage'取代。

我尝试在每个视图控制器的viewWillAppear中跟踪代码

 [self.navigationItem.backBarButtonItem setImage:new];

并尝试了

for(int i = 0; i != columns; ++i)
{
    var arr = new double[rows];
    for(var j = 0; j != rows; ++j)
        arr[j] = values[j, i];
    doubleList.Add(arr);
}

这也是。但一切都是徒劳的。 只有当我再次运行我的应用程序时才会更改图像,因此当Appdelegate中的代码被调用时。

Plz帮助!

6 个答案:

答案 0 :(得分:16)

对于设置自己的背面图像按钮,您需要设置自定义外观。并在appdelegate.h文件中调用。

注意:您需要在appdelegate.h中设置一次,然后将其应用于整个项目。不需要在每个控制器中声明。

请检查一下。

   //in Appdelegate.h file
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self customappearance]; //Method declaration
}

并在自定义外观中声明带有图像名称的图像。像这样,

-(void)customappearance
{
//int imageSize = 20;
UIImage *myImage = [UIImage imageNamed:@"icon_back"]; //set your backbutton imagename
UIImage *backButtonImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// now use the new backButtomImage
[[UINavigationBar appearance] setBackIndicatorImage:backButtonImage];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backButtonImage];


/*
 UIImage *backbutton=[[UIImage imageNamed:@"icon_back"]resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];

 //resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];

 [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backbutton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];*/
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0)
                                                     forBarMetrics:UIBarMetricsDefault];

}

并且您的导航栏后退按钮看起来像这样。

Custom back image in navigation bar

答案 1 :(得分:5)

最后以这种方式结束:

AppDelegate移除了代码,并在每个 View控制器的<{1}}中添加了以下代码行

viewWillAppear

现在后退按钮将不再起作用,因此必须在UIBarButtonItem * barButtonItem = [[UIBarButtonItem alloc] initWithImage:newimage style:UIBarButtonItemStylePlain target:self action:@selector(goBack)]; [self.navigationItem setLeftBarButtonItem:barButtonItem];

中明确提供其功能
@selector 'goBack'

答案 2 :(得分:2)

您需要将代码放入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

它会正常工作。

答案 3 :(得分:1)

尝试在ios7中以这种方式设置UIBarButtonItem: -

UIImage *temp = [[UIImage imageNamed:@"theImage"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];    
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithImage:temp style:UIBarButtonItemStyleBordered target:self action:@selector(action)];

以下是苹果开发中心讨论论坛的原始帖子

为了支持iOS7及更低版本,您可以检查系统版本并设置如下代码: -

UIImage *temp=nil;

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
{ 
    temp = [UIImage imageNamed:@"btn-back.png"]; 
}
else
{ 
    temp = [[UIImage imageNamed:@"btn-back.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];
 }

答案 4 :(得分:1)

对于swift 4来说,这对我很有用:

        let image = #imageLiteral(resourceName: "ic_navbar_back") //put your image here
        let backButtonImage = image.withRenderingMode(.alwaysOriginal)
        let appearance = UINavigationBar.appearance()
        appearance.backIndicatorImage = backButtonImage
        appearance.backIndicatorTransitionMaskImage = backButtonImage
        appearance.titleVerticalPositionAdjustment(for: .default)

您将在返回行之前的方法func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool内将此代码放入appdelegate

答案 5 :(得分:0)

确保在主线程中调用与UI相关的方法:

dispatch_async(dispatch_get_main_queue(), ^{
            [self.navigationItem.backBarButtonItem setBackButtonBackgroundImage:newimage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        });