web-dev-qa-db-ja.com

UIBarButtonItemを表示/非表示にする方法

私はいくつかのボタンを使ってIBでツールバーを作成しました。メインウィンドウのデータの状態に応じて、ボタンの1つを非表示にしたり表示したりできます。

UIBarButtonItemは隠しプロパティを持っていません、そしてこれまで隠した例はナビゲーションバーのボタンをnilに設定することでした。言うまでもなく、ボタンをIBOutletに接続した場合、それをnilに設定した場合、どのようにして元に戻すことができるかわかりません)。

239
Sasha

ボタンを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];
}

これはアウトレットに格納されているため、ツールバーに表示されていなくても参照は保持されます。

254
lnafziger

私はこの答えがこの質問に遅れていることを知っています。しかし、他の誰かが似たような状況に直面した場合、それは助けになるかもしれません。

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];
203
Max

これが簡単なアプローチです:

hide:  barbuttonItem.width = 0.01;
show:  barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)

私はちょうど私の網膜iPadでそれを走らせた、そして.01はそれが現れないように十分に小さい。

66
Drew Rosenberg

ボタンの幅を変更したりバーから削除したりすることなく、ボタンを所定の位置に隠すことができます。スタイルをプレーンに設定し、タイトルを削除してボタンを無効にすると、タイトルは消えます。元に戻すには、変更を元に戻すだけです。

-(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;
    }
}
57
Eli Burke

ナビゲーションバーを探していましたが、以下が私の解決策です。

navBar.topItem.rightBarButtonItem = nil;

ここで "navBar"はXIBのビューでNavigationBarへのIBOutletです。ここで私はボタンを隠すか、または何らかの条件に基づいてそれを見せたかったです。だから私は "If"で条件をテストしていると真の場合私はターゲットビューのviewDidLoadメソッドでボタンをnilに設定しています。

これはあなたの問題と完全には関係ないかもしれませんが、NavigationBarのボタンを隠したい場合には似たようなことが起こります。

42

Swift 3とSwift 4では、これを実行してUIBarButtomItemname__を隠すことができます。

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

そしてUIBarButtonItemname__を表示するには:

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

tintColorname__では、UIBarButtomItemname__に使用している原点の色を指定する必要があります。

25
pableiros

私は現在iOS 7.1をターゲットとしたOS X Yosemite開発者用プレビュー7とXcode 6ベータ6を実行しています、そして、以下の解決策は私のためにうまく働きます:

  • UINavigationItemUIBarButtonItemsのアウトレットを作成します
  • 次のコードを実行して削除します

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
    
  • もう一度ボタンを追加するには、以下のコードを実行します。

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
    
22
Olcay Ertaş

私は自分のプロジェクトでIBOutletsを使用しました。だから私の解決策は以下のとおりです。

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()

また、このバーをもう一度表示する必要があるときは、逆のプロパティを設定するだけです。

Swiftの代わりにenableisEnableプロパティを使います。

14
Den

iOS8。カスタム画像を含むUIBarButtonItem。多くの異なる方法を試してみました、それらのほとんどは助けにはならなかった。 Maxの解決策であるsetTintColorname__はどの色にも変わらなかった。私はこれを自分で考え出し、それが誰かに役立つと思いました。

隠すために:

[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];

見せるために:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
12
Rinto Rapheal

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

12
Dmitry Semenyuk

試してみてくださいSwift、AppDelegateのフォントサイズのようなUIBarButtonItemのデザインがある場合はtintColorを更新しないでください。表示されるときにボタンの外観が完全に変わります。

テキストボタンの場合、タイトルを変更するとボタンが消える可能性があります。

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
9
Jeffrey Neo

私は、他の人が提案したtintColorisEnabledのアプローチにしわがあることを発見しました - 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

私の場合は、まだバーボタンアイテムのスペースを占有することは問題になりませんでした。右バーボタンアイテムの一番左に隠れて表示されていたからです。

6
Evan Kirkwood
@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];
5
umakanta

UIBarButtonItemを「非表示にする」方法はありません。スーパービューから削除して、もう一度表示するときに元に戻す必要があります。

4
Kyle Richter

これは回答リストのかなり下の方にありますが、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);
    }
}
4
maninvan

そのための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];

3
iNoob

バーボタン項目が無効になっているときにテキストの色をクリアカラーに設定することは、おそらくよりきれいなオプションです。あなたがコメントで説明しなければならないという奇妙さはありません。また、ボタンを壊さないようにして、関連するストーリーボードのセグエを保持します。

[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
                                                      forState:UIControlStateDisabled];

その後、バーボタンの項目を非表示にしたいときは、次のようにします。

self.navigationItem.rightBarButton.enabled = NO;

隠し資産はありませんが、これは同じ結果をもたらします。

2
puppybits

UIBarButtonItemがその中にテキストの代わりに画像を持っている場合、あなたはそれを隠すためにこれをすることができます:navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

2
Artem Goryaev

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];
    }
}
2
Guy Lowe

このようにして簡単にビューを取得して非表示にすることができます

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
2

barButton.customView = UIView()をセットしてトリックを見てください

2
jeff ayan

Swift版の場合、これがコードです。

UINavigationBarの場合:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil
1
Sohil R. Memon

あなたの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];
    }
}
1
Renato Lochetti

これはこれを処理する拡張機能です。

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
1
Harris

IBでは、ボタンのタイトルを空白のままにすると、表示されません(初期化されませんか?)。私はそれを削除してそのすべてのアウトレット参照をゴミ箱にしないでビルドのためにバーボタン項目を一時的に消す一時的なものにしたいならばUI更新中の開発中にこれを頻繁に行います。

ボタンのタイトルをnilに設定してもボタン全体が消えることはありません。すみませんがあなたの質問には実際に答えませんが、ある人にとっては役に立つかもしれません。

編集:このトリックは、ボタンのスタイルがプレーンに設定されている場合にのみ機能します。

0
pretzels1337

私はxibとUIToolbarで働いた。 BarButtonItemはxibファイルに作成されました。 BarButtonItem用にIBOutletを作成しました。そして私は私のBarButtonItemを隠すためにこのコードを使いました

 self.myBarButtonItem.enabled = NO;
 self.myBarButtonItem.title =  nil;

これは私を助けました。

0
Malder

私はそれがまだここで言及されているのを見つけることができなかったので私はここに私の解決策を追加するつもりです。動的ボタンがあり、その画像は1つのコントロールの状態に依存します。私にとって最も簡単な解決策は、コントロールが存在しない場合にイメージをnilに設定することでした。画像はコントロールが更新されるたびに更新されたので、これは私にとって最適でした。 enabledNOに設定するようにしてください。

幅を最小値に設定しても、iOS 7では機能しませんでした。

0
mkko

@ 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を通してワイヤーで縛られる強いバーボタンアイテムで)。

0
Chris Conover

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;
0
Graham

テキスト属性を使ってバーボタンを隠すことができます。

barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)

UIBarButtonItem拡張を使った同様の質問に対する解決策も参照してください。 Swift IOSを使用してUIBarButtonItemをdisapearにする

0
iUrii

サブクラス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)

必要に応じてアイテムを再追加できると思います。

0
Atara