IB でいくつかのボタンを備えたツールバーを作成しました。メイン ウィンドウのデータの状態に応じて、ボタンの 1 つを非表示/表示できるようにしたいと考えています。
UIBarButtonItem
には隠しプロパティがありません。これまでに見つけた非表示の例には、ナビゲーション バー ボタンを nil に設定することが含まれています。ちなみに、ボタンを IBOutlet に接続した場合、それを nil に設定すると、どのように戻すかわかりません)。
IB でいくつかのボタンを備えたツールバーを作成しました。メイン ウィンドウのデータの状態に応じて、ボタンの 1 つを非表示/表示できるようにしたいと考えています。
UIBarButtonItem
には隠しプロパティがありません。これまでに見つけた非表示の例には、ナビゲーション バー ボタンを nil に設定することが含まれています。ちなみに、ボタンを IBOutlet に接続した場合、それを nil に設定すると、どのように戻すかわかりません)。
ボタンを強力なアウトレットに保存し(それを と呼びましょう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
:-これは、「完了」、「保存」などのバーボタンアイテムではうまく機能します。ただし、テキストではないため、追加、ゴミ箱シンボルなどのアイテムでは機能しません(少なくとも私にとってはそうではありません)。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)
Retina iPadで実行したところ、.01は小さすぎて表示されませんでした。
Swift 3 および Swift 4 の場合、これを実行して以下を非表示にできますUIBarButtomItem
。
self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear
そして表示するにはUIBarButtonItem
:
self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue
で、tintColor
使用している元の色を指定する必要がありますUIBarButtomItem
現在、OS X Yosemite Developer Preview 7 と iOS 7.1 をターゲットとする Xcode 6 beta 6 を実行していますが、次のソリューションは問題なく動作します。
UINavigationItem
およびUIBarButtonItem
のアウトレットを作成する次のコードを実行して削除します
[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 3では、代わりにプロパティをenable
使用しisEnable
ます。
self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
Swiftで試してtintColor
ください。AppDelegate のフォント サイズのような UIBarButtonItem のデザインがある場合は、更新しないでください。表示時にボタンの外観が完全に変わります。
テキスト ボタンの場合、タイトルを変更するとボタンが「消える」ことがあります。
if WANT_TO_SHOW {
myBarButtonItem.enabled = true
myBarButtonItem.title = "BUTTON_NAME"
}else{
myBarButtonItem.enabled = false
myBarButtonItem.title = ""
}
@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];
設定 barButton.customView = UIView()
してトリックを見るだけ
UIBarButtonItem を「非表示」にする方法はありません。再度表示する場合は、スーパービューから削除して追加し直す必要があります。
これを行う 1 つの方法は initWithCustomView:(UIView *)
、 を割り当てるときに のプロパティを使用することですUIBarButtonItem
。のサブクラスにUIView
は、非表示/非表示のプロパティがあります。
例えば:
1.UIButton
非表示/非表示にしたいを持っています。
2.をUIButton
カスタム ビューとして作成します。お気に入り :
UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button
UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];
3.作成した を非表示/非表示にするmyButton
ことができます。[myButton setHidden:YES];
If you are using Swift 3
if (ShowCondition){
self.navigationItem.rightBarButtonItem = self.addAsset_btn
}
else {
self.navigationItem.rightBarButtonItem = nil
}
バーボタン項目が無効になっているときにテキストの色をクリアな色に設定すると、おそらくよりクリーンなオプションになります。コメントで説明しなければならないような奇妙さはありません。また、ボタンを破棄しないため、関連付けられているストーリーボードのセグエは引き続き保持されます。
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
forState:UIControlStateDisabled];
次に、バーボタンアイテムを非表示にしたいときはいつでも、次のようにすることができます:
self.navigationItem.rightBarButton.enabled = NO;
隠しプロパティがないのは残念ですが、これは同じ結果を提供します。
複数のツールバーとそれぞれに複数のボタンがあるため、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];
}
}
UIBarButtonItem にテキストではなく画像がある場合、これを実行して非表示にすることができます。
navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;
テキスト属性を使用して、バー ボタンを非表示にすることができます。
barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)
同様の質問については、UIBarButtonItem 拡張機能を使用した私のソリューションも参照してください: Make a UIBarButtonItem disapear using swift IOS
@lnafziger、@MindSpiker、@vishal などの功績によるものです。アル、
単一の右 (または左) バー ボタンに対して到達した最も単純なライナーは次のとおりです。
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経由で配線された強力なバーボタンアイテムを使用)。
IB では、ボタンのタイトルを空白のままにすると表示されません (初期化されませんか?)。バーボタンアイテムを削除せずにビルドのために一時的に非表示にしたい場合、UIの更新中の開発中にこれを頻繁に行い、すべてのアウトレット参照を破棄します。
ボタンのタイトルを nil に設定しても、ボタン全体が消えることはありません。申し訳ありませんが、あなたの質問には実際には答えていませんが、一部の人にとっては役立つかもしれません.
編集: このトリックは、ボタンのスタイルがプレーンに設定されている場合にのみ機能します
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;
ここでまだ言及されていないので、ここに私の解決策を追加します。画像が 1 つのコントロールの状態に依存する動的ボタンがあります。私にとって最も簡単な解決策はnil
、コントロールが存在しない場合に画像を設定することでした。コントロールが更新されるたびに画像が更新されるため、これは私にとって最適でした。念のため、 も に設定enabled
しNO
ます。
幅を最小値に設定しても、iOS 7 では機能しませんでした。
私はxibとUIToolbarで作業しました。BarButtonItem は xib ファイルで作成されました。BarButtonItem の IBOutlet を作成しました。そして、このコードを使用して BarButtonItem を非表示にしました
self.myBarButtonItem.enabled = NO;
self.myBarButtonItem.title = nil;
これは私を助けました。
leftBarButtonItems が 2 つあるという問題がありました。Mac Catalyst では、firstButton は、サポートされていないアクションを指していました: AVFoundation でビデオを録画します。2 番目のボタンのみが Mac Catalyst で有効でした: UIImagePickerController を使用します。
そのため、Mac Catalyst では、最初の UIBarButtonItem を secondButton に向け、常に 2 番目の UIBarButtonItem を非表示にする必要がありました。iOS では、両方のボタンが表示されます。これが私の解決策でした:
#if TARGET_OS_MACCATALYST
self.navigationItem.leftBarButtonItem = self.secondButton;
NSUInteger count = [self.navigationItem.leftBarButtonItems count];
for (NSUInteger i = 0; i < count; i++) {
UIBarButtonItem *thisButton = [self.navigationItem.leftBarButtonItems objectAtIndex:i];
if (i == 1) {
thisButton.enabled = NO;
thisButton.tintColor = [UIColor clearColor];
}
}
#else
self.navigationItem.leftBarButtonItem = self.firstButton;
#endif
同等の問題を抱えている人に役立つことを願っています。
私のソリューションはbounds.width
、UIBarButtonItem内にあるものに対して0に設定されています(私はUIButtonとUISearchBarでこのアプローチを使用しました):
隠れる:
self.btnXXX.bounds = CGRectMake(0,0,0,0);
公演:
self.btnXXX.bounds = CGRectMake(0,0,40,30); // <-- put your sizes here