我使用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帮助!
答案 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];
}
并且您的导航栏后退按钮看起来像这样。
答案 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];
});