私はいくつかのボタンを使ってIBでツールバーを作成しました。メインウィンドウのデータの状態に応じて、ボタンの1つを非表示にしたり表示したりできます。
UIBarButtonItem
は隠しプロパティを持っていません、そしてこれまで隠した例はナビゲーションバーのボタンをnilに設定することでした。言うまでもなく、ボタンをIBOutletに接続した場合、それをnilに設定した場合、どのようにして元に戻すことができるかわかりません)。
ボタンをstrongアウトレットに保存し(myButton
と呼びましょう)、追加/削除します。
// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];
// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];
// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
// The following line adds the object to the end of the array.
// If you want to add the button somewhere else, use the `insertObject:atIndex:`
// method instead of the `addObject` method.
[toolbarButtons addObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];
}
これはアウトレットに格納されているため、ツールバーに表示されていなくても参照は保持されます。
私はこの答えがこの質問に遅れていることを知っています。しかし、他の誰かが似たような状況に直面した場合、それは助けになるかもしれません。
IOS 7では、バーボタン項目を非表示にするために、次の2つのテクニックを使用できます。
SetTitleTextAttributes
を使用します。 - これは、 "Done"、 "Save"などのバーボタン項目ではうまく機能します。TintColor
を使用します: - 私が "deleteButton"と呼ばれるバーボタンアイテムを持っているならば: - ボタンを隠すために、私は次のコードを使用しました: -
[self.deleteButton setEnabled:NO];
[self.deleteButton setTintColor: [UIColor clearColor]];
ボタンをもう一度表示するには、次のコードを使用しました。
[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
これが簡単なアプローチです:
hide: barbuttonItem.width = 0.01;
show: barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)
私はちょうど私の網膜iPadでそれを走らせた、そして.01はそれが現れないように十分に小さい。
ボタンの幅を変更したりバーから削除したりすることなく、ボタンを所定の位置に隠すことができます。スタイルをプレーンに設定し、タイトルを削除してボタンを無効にすると、タイトルは消えます。元に戻すには、変更を元に戻すだけです。
-(void)toggleBarButton:(bool)show
{
if (show) {
btn.style = UIBarButtonItemStyleBordered;
btn.enabled = true;
btn.title = @"MyTitle";
} else {
btn.style = UIBarButtonItemStylePlain;
btn.enabled = false;
btn.title = nil;
}
}
ナビゲーションバーを探していましたが、以下が私の解決策です。
navBar.topItem.rightBarButtonItem = nil;
ここで "navBar"はXIBのビューでNavigationBarへのIBOutletです。ここで私はボタンを隠すか、または何らかの条件に基づいてそれを見せたかったです。だから私は "If"で条件をテストしていると真の場合私はターゲットビューのviewDidLoadメソッドでボタンをnilに設定しています。
これはあなたの問題と完全には関係ないかもしれませんが、NavigationBarのボタンを隠したい場合には似たようなことが起こります。
Swift 3とSwift 4では、これを実行してUIBarButtomItem
name__を隠すことができます。
self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear
そしてUIBarButtonItem
name__を表示するには:
self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue
tintColor
name__では、UIBarButtomItem
name__に使用している原点の色を指定する必要があります。
私は現在iOS 7.1をターゲットとしたOS X Yosemite開発者用プレビュー7とXcode 6ベータ6を実行しています、そして、以下の解決策は私のためにうまく働きます:
UINavigationItem
とUIBarButtonItem
sのアウトレットを作成します次のコードを実行して削除します
[self.navItem setRightBarButtonItem:nil];
[self.navItem setLeftBarButtonItem:nil];
もう一度ボタンを追加するには、以下のコードを実行します。
[self.navItem setRightBarButtonItem:deleteItem];
[self.navItem setLeftBarButtonItem:addItem];
私は自分のプロジェクトでIBOutletsを使用しました。だから私の解決策は以下のとおりです。
@IBOutlet weak var addBarButton: UIBarButtonItem!
addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()
また、このバーをもう一度表示する必要があるときは、逆のプロパティを設定するだけです。
Swiftの代わりにenable
はisEnable
プロパティを使います。
iOS8。カスタム画像を含むUIBarButtonItem。多くの異なる方法を試してみました、それらのほとんどは助けにはならなかった。 Maxの解決策であるsetTintColor
name__はどの色にも変わらなかった。私はこれを自分で考え出し、それが誰かに役立つと思いました。
隠すために:
[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];
見せるために:
[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
試してみてくださいSwift、AppDelegateのフォントサイズのようなUIBarButtonItemのデザインがある場合はtintColor
を更新しないでください。表示されるときにボタンの外観が完全に変わります。
テキストボタンの場合、タイトルを変更するとボタンが消える可能性があります。
if WANT_TO_SHOW {
myBarButtonItem.enabled = true
myBarButtonItem.title = "BUTTON_NAME"
}else{
myBarButtonItem.enabled = false
myBarButtonItem.title = ""
}
私は、他の人が提案したtintColor
とisEnabled
のアプローチにしわがあることを発見しました - VoiceOverがアクセシビリティに有効で、ボタンが論理的に非表示の場合、アクセシビリティカーソルはバーボタンにフォーカスします。これは「淡色表示」されています(つまり、isEnabled
がfalseに設定されているため)。受け入れられた答えのアプローチはこの副作用に悩まされません、しかし私が見つけたもう一つの回避策はボタンを "隠す"ときisAccessibilityElement
をfalseに設定することでした:
deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false
ボタンを「表示」するときにisAccessibilityElement
をtrueに戻します。
deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true
私の場合は、まだバーボタンアイテムのスペースを占有することは問題になりませんでした。右バーボタンアイテムの一番左に隠れて表示されていたからです。
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {
var isHidden: Bool = false {
didSet {
isEnabled = !isHidden
tintColor = isHidden ? UIColor.clear : UIColor.black
}
}
}
そして今、単にisHidden
プロパティを変更します。
@lnafzigerの回答からの改善
あなたのBarbuttonsを強いアウトレットに保存して、これを隠したり表示したりします。
-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
// Get the reference to the current toolbar buttons
NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];
// This is how you remove the button from the toolbar and animate it
[navBarBtns removeObject:myButton];
[self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}
-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
// Get the reference to the current toolbar buttons
NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];
// This is how you add the button to the toolbar and animate it
if (![navBarBtns containsObject:myButton]) {
[navBarBtns addObject:myButton];
[self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}
}
必要に応じて以下の機能を使用してください..
[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
UIBarButtonItemを「非表示にする」方法はありません。スーパービューから削除して、もう一度表示するときに元に戻す必要があります。
これは回答リストのかなり下の方にありますが、Swiftソリューションのために誰かが簡単なコピー&ペーストを望んでいる場合に備えて、ここにあります。
func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
var toolbarButtons: [UIBarButtonItem] = toolbar.items!
toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
toolbar.setItems(toolbarButtons, animated: true)
}
func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
var toolbarButtons: [UIBarButtonItem] = toolbar.items!
if !toolbarButtons.contains(button) {
toolbarButtons.insert(button, atIndex: index)
toolbar.setItems(toolbarButtons, animated:true);
}
}
そのための1つの方法は、UIBarButtonItem
を割り当てるときのinitWithCustomView:(UIView *)
プロパティを使用することです。 UIView
のサブクラスはhide/unhideプロパティを持ちます。
例えば:
1。隠したり隠したりしたいUIButton
を持ってください。
2UIButton
をカスタムビューにします。好きです:
UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button
UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];
。あなたが作成したmyButton
を表示/非表示にすることができます。 [myButton setHidden:YES];
バーボタン項目が無効になっているときにテキストの色をクリアカラーに設定することは、おそらくよりきれいなオプションです。あなたがコメントで説明しなければならないという奇妙さはありません。また、ボタンを壊さないようにして、関連するストーリーボードのセグエを保持します。
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
forState:UIControlStateDisabled];
その後、バーボタンの項目を非表示にしたいときは、次のようにします。
self.navigationItem.rightBarButton.enabled = NO;
隠し資産はありませんが、これは同じ結果をもたらします。
UIBarButtonItemがその中にテキストの代わりに画像を持っている場合、あなたはそれを隠すためにこれをすることができます:navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;
Swift 3を使用している場合
if (ShowCondition){
self.navigationItem.rightBarButtonItem = self.addAsset_btn
}
else {
self.navigationItem.rightBarButtonItem = nil
}
いくつかのヘルパーメソッド私は、それぞれに複数のツールバーと複数のボタンがあるので、lnafzigerの受け入れられた答えに基づいて共有すると思いました。
-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
[toolbarButtons removeObject:button];
[toolbar setItems:toolbarButtons animated:NO];
}
-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
if (![toolbarButtons containsObject:button]){
[toolbarButtons insertObject:button atIndex:index];
[self setToolbarItems:toolbarButtons animated:YES];
}
}
このようにして簡単にビューを取得して非表示にすることができます
let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
barButton.customView = UIView()
をセットしてトリックを見てください
Swift版の場合、これがコードです。
UINavigationBar
の場合:
self.navigationItem.rightBarButtonItem = nil
self.navigationItem.leftBarButtonItem = nil
あなたのUIBarButtonItem
がタイトルの代わりに背景画像を持っているなら、Eli Burkeの応答を補完するために、あなたはコードを使うことができます:
-(void)toggleLogoutButton:(bool)show{
if (show) {
self.tabButton.style = UIBarButtonItemStyleBordered;
self.tabButton.enabled = true;
UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"];
[((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal];
} else {
self.tabButton.style = UIBarButtonItemStylePlain;
self.tabButton.enabled = false;
[((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal];
}
}
これはこれを処理する拡張機能です。
extension UIBarButtonItem {
var isHidden: Bool {
get {
return tintColor == .clear
}
set {
tintColor = newValue ? .clear : .white //or whatever color you want
isEnabled = !newValue
isAccessibilityElement = !newValue
}
}
}
使用法:
myBarButtonItem.isHidden = true
IBでは、ボタンのタイトルを空白のままにすると、表示されません(初期化されませんか?)。私はそれを削除してそのすべてのアウトレット参照をゴミ箱にしないでビルドのためにバーボタン項目を一時的に消す一時的なものにしたいならばUI更新中の開発中にこれを頻繁に行います。
ボタンのタイトルをnilに設定してもボタン全体が消えることはありません。すみませんがあなたの質問には実際に答えませんが、ある人にとっては役に立つかもしれません。
編集:このトリックは、ボタンのスタイルがプレーンに設定されている場合にのみ機能します。
私はxibとUIToolbarで働いた。 BarButtonItemはxibファイルに作成されました。 BarButtonItem用にIBOutletを作成しました。そして私は私のBarButtonItemを隠すためにこのコードを使いました
self.myBarButtonItem.enabled = NO;
self.myBarButtonItem.title = nil;
これは私を助けました。
私はそれがまだここで言及されているのを見つけることができなかったので私はここに私の解決策を追加するつもりです。動的ボタンがあり、その画像は1つのコントロールの状態に依存します。私にとって最も簡単な解決策は、コントロールが存在しない場合にイメージをnil
に設定することでした。画像はコントロールが更新されるたびに更新されたので、これは私にとって最適でした。 enabled
もNO
に設定するようにしてください。
幅を最小値に設定しても、iOS 7では機能しませんでした。
@ lnafziger、@ MindSpiker、@vishalなどに敬意を表して。アル、
1つの右(または左)のバーボタンにたどり着いた最も単純な1つのライナーは、次のとおりです。
self.navigationItem.rightBarButtonItem = <#StateExpression#>
? <#StrongPropertyButton#> : nil;
のように:
@interface MyClass()
@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;
@end
@implementation
- (void) updateState
{
self.navigationItem.rightBarButtonItem = <#StateExpression#>
? <#StrongPropertyButton#> : nil;
}
@end
私はこれをテストしました、そしてそれは私のために働きます(IBを通してワイヤーで縛られる強いバーボタンアイテムで)。
Toolbar.items配列を操作する必要があります。
これは、[完了]ボタンを非表示にして表示するためのコードです。ボタンがツールバーの端または他のボタンの間にある場合は、他のボタンが移動するため、ボタンを消したいだけの場合は、ボタンを最後のボタンとして中央に配置します。ボタンの動きをアニメートして効果を上げています。とても気に入っています。
-(void)initLibraryToolbar {
libraryToolbarDocumentManagementEnabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
[libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
[libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
[libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
trashCan.enabled = NO;
mail.enabled = NO;
[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];
}
だから今あなたのボタンを表示するために次のコードを使用することができます
[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES;
ボタンを非表示にする
[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
テキスト属性を使ってバーボタンを隠すことができます。
barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)
UIBarButtonItem拡張を使った同様の質問に対する解決策も参照してください。 Swift IOSを使用してUIBarButtonItemをdisapearにする
サブクラスUIBarButtonItem
。 Interface BuilderのボタンがHidableBarButtonItem
に設定されていることを確認してください。ボタンからView Controllerへのアウトレットを作ります。 View ControllerからsetHidden:
を呼び出してボタンを隠したり表示したりできます。
HidableBarButtonItem.h
#import <UIKit/UIKit.h>
@interface HidableBarButtonItem : UIBarButtonItem
@property (nonatomic) BOOL hidden;
@end
HidableBarButtonItem.m
#import "HidableBarButtonItem.h"
@implementation HidableBarButtonItem
- (void)setHidden:(BOOL const)hidden {
_hidden = hidden;
self.enabled = hidden ? YES : NO;
self.tintColor = hidden ? [UIApplication sharedApplication].keyWindow.tintColor : [UIColor clearColor];
}
@end
多くのアイテムの1つを非表示にするために、次のコードを使用しました。
self.navigationItem.leftBarButtonItems?.remove(at: 0)
self.navigationItem.rightBarButtonItems?.remove(at: 1)
必要に応じてアイテムを再追加できると思います。