Can't set color for UIBarButtonSystemItem - iphone

I have been trying to have a UIBarButtonSystemItem in my toolbar and it always defaults to the standard blue. If I create it with an image or title it works fine with the correct color, try it with UIBarButtonSystemItem and it goes to the default color and nothing I have found on the internet works.
heres the code:
UIBarButtonItem *overlays = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPageCurl target:self action:#selector(overlays)];

Had to create my own button. Seems to be a bit of a bug that initWithBarButtonSystemItem default back to the standard colour. Few people have requested to Apple to fix it but no luck so far.

I realize this is old, but the color of the button is dependent on the color of the navigationbar. You must create a custom button like you did. This is most likely a Apple HIG deal.

Related

UIBarButtonItem Done State Without Border

I have a UIToolbar where all the buttons have a style of UIBarButtonItemStylePlain. One of these buttons toggles a setting in my app and I would like to have some type of Selected state when that feature is enabled.
Since I am not using bordered buttons, setting the style to UIBarButtonItemStyleDone would not work because the button would not match. Is there an easy way to change to color of the icon on the button?
For a sample, look at the location button in the Maps app on the iPad. It does exactly what I am looking for.
Sure thing. You can set the background image with initWithImage:style:target:action: or supply a custom view with initWithCustomView:

Change (not init) a UIBarButtonItem identifier programmatically?

In IB I can set the identifier of a UIBarButtonItem to 'play' which adds an image of a play button (right-pointing triangle).
Is there a way to change this image programmatically? I want to change it to 'pause' when the play button is pressed.
I know you can initialize a UIBarButtonItem with an identifier but I've yet to find a way to change it after it's been initialized. Is this even possible?
The only thing I can think of is to remove the old button and initialize a new one in its place, but this hardly seems efficient.
Any thoughts?
Ok I've googled this question to death and ran into sample code from Apple where they do exactly the same thing (toggle play/pause button graphic on a toolbar button). But instead of using the built in play and pause identifiers of UIBarButtonItem they use a custom UIButton and toggle custom images.
So if Apple goes through the trouble of creating and toggling custom images on a UIButton instead of the built in play and pause UIBarButtonItem buttons then I think it's pretty safe to say there's no way to programatically change the identifier of a UIBarButtonItem.
This is what they (Apple) do to toggle the images when the button is pressed:
// Call this when the button you want to toggle is pressed:
[playButton setImage:((p.playing == YES) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];
Replace p.playing with whatever BOOL you want to hold the state of your button. playButton is the custom UIButton in the toolbar. pauseBtnBG and playBtnBG are the images to toggle.
This seems to work fairly well:
UIBarButtonItem *oldButton = [myToolBar.items objectAtIndex:1];
[myToolBar setItems:[NSArray arrayWithObjects:[myToolBar objectAtIndex:0], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:#selector(tapStopRefreshButton:)],nil] animated:NO];
[oldButton release];
In this example I had a toolbar for a UIWebView and when someone clicked Reload I wanted it to change to Stop. The toolbar only had a flexible space and the one button on it - to right-align the button - so I grabbed a reference to the old button, made a new one with the same selector as the old, reset the buttons on the tab bar, and then released the original button.
Not the prettiest, but you can use all standard buttons without having to override the button class(es).
What about 2 stacked toolbars? Then you can have some system buttons in the top one, and others in the bottom one. If the play button is pressed, then just hide the top toolbar.

UIBarButtonItem does not appear to respond to "style" property

Situation: I'm placing an instance of a system "item action" button into the right navigation button slot... no problems there. However, I want that button to display as just the icon WITHOUT a border around it (ie: "plain" style). Reading over documentation, it sounds like this should be a simple matter of just setting the UIBarButtonItem's "style" property to UIBarButtonItemStylePlain, like so:
UIBarButtonItem *shareButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:#selector(didPressShare)];
shareButton.style = UIBarButtonItemStylePlain;
self.navigationItem.rightBarButtonItem = shareButton;
[shareButton release];
However, when I implement the above code, the button appears in the nav bar with a border around it... apparently the system is not observing my UIBarButtonItemStylePlain setting. Any ideas as to why? Any other solutions for making a button appear a just the icon and no border around it?
Thanks in advance!
I'm sorry to tell you, but as far as I know you can't use plain style with UINavigationBar.
If it is possible use UIToolbar instead.

How do I set the color for the editButtonItem in the navigation bar of a UITableViewController?

I have a UITableViewController where I added a "editButtonItem" in the navigation bar :
self.navigationItem.leftBarButtonItem = self.editButtonItem;
No magic here, but I try to define the color (background and foreground/textcolor) of this button.
I read in the Apple forum somewhere that the button changes the color if I change the navigationbar to the same color, well despite the fact that I do not get this to work either (for testing) I do not want to touch the navigationbr itself, just the button.
Since this button is already predefined I am not sure how to handle this. Do I need to overwrite the button with my own definition or can I just simply apply a new style (if so how ?)
Thx
If everything fails, you can tint the bar in the viewDidLoad of your childViewController
[self.navigationController.navigationBar setTintColor:[UIColor colorWithHue:50 saturation:50 brightness:.2 alpha:.5]];
The only way I can find to make a UIBarButtonItem with a different color is to use a custom view and the initWithCustomView: method. Predefined buttons and those created using initWithTitle:target:action: cannot change their background color.
Take a look at this SO question: UIBarButtonItem with color?
These links might also help:
http://www.iphonedevsdk.com/...
http://www.insanelymac.com/...

iPhone Navigation-Based application - some global toolbar questions

I started iPhone development two months ago, so I can't call myself "expert" ;-) But I learned a lot in these two months, a lot here from stackoverflow :)
I'm working on an iPhone app which is based on the "Navigation-Based application" app template. My RootViewController is, of course, an UITableView. From that TableView, I can navigate to some views and one TableView.
I'm using a global toolbar, it's called in the RootViewController. Buttons are added to it in the view that needs the buttons.
Now, I have some questions regarding the use of the toolbar
I insert a flexible space with that code:
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
and a fixed space like this:
UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];
My question: The flexible space is working, but how do I tell the fixed space which width it should have?
2. I noticed that my Todo-App "Things" uses a global toolbar with switching button sets. But in Things, there's some kind of fading effect when the button set is changing. How can I do that in my app?
The docs say:
UIBarButtonSystemItemFixedSpace
Blank space to add between other
items. Only the width property is used
when this value is set.
Set the item's width property.
To change the items on the toolbar and have it fade between the two sets, try this instance method of UIToolbar:
- (void)setItems:(NSArray *)items animated:(BOOL)animated
You basically keep the two sets of toolbar items in two arrays.
Thanks, it's working now :-)
So, question 1 is solved.
Answers to question 2 are still welcome ;-)