ฉันจะแสดง / ซ่อน UIBarButtonItem ได้อย่างไร


251

ฉันสร้างแถบเครื่องมือใน IB ด้วยปุ่มหลายปุ่ม ฉันต้องการซ่อน / แสดงปุ่มใดปุ่มหนึ่งขึ้นอยู่กับสถานะของข้อมูลในหน้าต่างหลัก

UIBarButtonItem ไม่มีคุณสมบัติที่ซ่อนอยู่และตัวอย่างใด ๆ ที่ฉันเคยพบเพื่อซ่อนพวกเขาเกี่ยวข้องกับการตั้งค่าปุ่มแถบนำทางเป็นศูนย์ซึ่งฉันไม่คิดว่าฉันต้องการทำที่นี่เพราะฉันอาจต้องแสดงปุ่มอีกครั้ง (ไม่ เพื่อพูดถึงว่าถ้าฉันเชื่อมต่อปุ่มของฉันกับ IBOutlet ถ้าฉันตั้งค่าเป็นศูนย์ฉันไม่แน่ใจว่าฉันจะเอามันกลับมาได้อย่างไร)


ฉันเพียงแค่ปิดการใช้งานและเพิ่มป้ายกำกับการเข้าถึงว่าคุณลักษณะของปุ่มไม่สามารถใช้ได้
Daniel Springer

คำตอบ:


263

บันทึกปุ่มของคุณในร้านที่แข็งแรง (เรียกมันว่า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];
}

เนื่องจากเก็บไว้ในเต้าเสียบคุณจะทำการอ้างอิงถึงแม้ว่าจะไม่ได้อยู่บนแถบเครื่องมือ


73
เพื่อให้การทำงานนี้สำหรับปุ่มขวาของฉันในตัวควบคุมทิศทางฉันใช้ self.navigationItem.rightBarButtonItems และ [self.navigationItem setRightBarButtonItems <prams>] แทน toolBarItems และ setToolBarItems
MindSpiker

@MindSpiker: ใช่เขาใช้เทคนิคเดียวกันกับปุ่มบนแถบนำทางด้วย
lnafziger

1
ฉันจะต้องไม่มี myButton ใน dealloc หรือไม่?
Van Du Tran

48
หรือ Apple อาจเพิ่มคุณสมบัติ. hidden -_-
GeneCode

217

ฉันรู้ว่าคำตอบนี้มาสายสำหรับคำถามนี้ อย่างไรก็ตามอาจช่วยได้ถ้ามีใครประสบสถานการณ์คล้ายกัน

ใน iOS 7 เพื่อซ่อนรายการปุ่มแถบเราสามารถใช้สองเทคนิคต่อไปนี้: -

  • การใช้งานSetTitleTextAttributes: - ใช้งานได้ดีกับรายการปุ่มบาร์เช่น "เสร็จสิ้น", "บันทึก" ฯลฯ แต่มันใช้งานไม่ได้กับรายการเช่นเพิ่ม, สัญลักษณ์ถังขยะ ฯลฯ (อย่างน้อยก็ไม่ใช่สำหรับฉัน) เนื่องจากไม่ใช่ข้อความ
  • ใช้TintColor: - ถ้าฉันมีรายการปุ่มบาร์ที่ชื่อว่า "deleteButton": -

เพื่อซ่อนปุ่มฉันใช้รหัสต่อไปนี้: -

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

เพื่อแสดงปุ่มอีกครั้งฉันใช้รหัสต่อไปนี้: -

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];

[self.navigationItem.rightBarButtonItem setEnabled: NO]; [self.navigationItem.rightBarButtonItem setTintColor: [UIColor clearColor]];
Leon

3
สำหรับ Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()เพื่อปิดและซ่อนและdeleteButton.enabled = true; deleteButton.tintColor = nilเพื่อเปิดใช้งานและแสดงตามปกติ
Unixmonkey

1
ฉันชอบวิธีการนี้ที่ให้ฉันใส่ตรรกะว่าจะแสดง UIBarButton ในคลาสนั้นหรือไม่ เหตุผลที่ใช้งานได้กับปุ่มเดียวนั้นไม่ชัดเจนในทันที - เป็นเพราะถ้าคุณซ่อนปุ่มด้วยวิธีนี้มันจะยังคงใช้พื้นที่ดังนั้นคุณอาจมีช่องว่างถ้าคุณมีหลายปุ่ม
SimplGy

วิธีแรกของคุณสมบูรณ์แบบสำหรับฉัน ฉันจะตั้งค่าUIColor.clearสำหรับUIControlState.disabledและสามารถแสดง / setEnabledซ่อนปุ่มที่มี แน่นอนตามที่ระบุไว้ปุ่มนี้ใช้งานได้กับปุ่มข้อความเท่านั้น
fl034

หากกดค้างไว้นานจนกว่าจะปรากฏขึ้นในภาพขนาดใหญ่ (อาจเป็นเรื่องการเข้าถึงได้) จากนั้นแม้จะมีการตั้งค่า isEnabled ให้เป็นเท็จ แต่ก็ยังใช้งานได้
Daniel Springer

67

นี่เป็นวิธีง่ายๆ:

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

ฉันเพิ่งวิ่งบน iPad เรตินาและ. 01 นั้นเล็กพอที่จะไม่แสดง


13
จากการแก้ปัญหาทั้งหมดอันนี้อย่างรวดเร็วสกปรกและมีประสิทธิภาพ ฉันยังเพิ่ม barbuttItem.enabled = NO; เนื่องจากฉันยังคงได้รับปุ่มที่จะยิงถ้าฉันกดมันมากพอ
Stickley

1
ไม่ได้ผลสำหรับฉัน ฉันคิดว่าเป็นเพราะฉันใช้ปุ่มเพิ่มที่มีรูปภาพ '+' แต่ฉันลองใช้ปุ่มกำหนดเองที่มีข้อความ "ใหม่" แทน แต่ก็ยังไม่หายไป การเปลี่ยนแปลงการเปิดใช้งานเพื่อให้ฉันรู้ว่ารหัสของฉันกำลังถูกดำเนินการ ความคิดใด ๆ โปรดทราบว่าปุ่มนี้สร้างขึ้นในกระดานเรื่องราวและมีส่วนต่อท้ายดังนั้นฉันไม่ต้องการเปลี่ยนเป็นปุ่มแบบเป็นโปรแกรมแทน
Rhubarb

19
ดูเหมือนจะไม่ทำงานในแถบเครื่องมือควบคุมการนำทาง แต่ใช้กับแถบเครื่องมืออื่น
Drew Rosenberg

3
มันซ่อน แต่ก็ยังตอบสนองต่อการแตะ สำหรับฉันมันทำหน้าที่เหมือนปุ่มที่มองไม่เห็น
Tibidabo

หากคุณได้ตั้งค่าสีอ่อนทั่วโลกโดยใช้บรรทัดนี้self.window?.tintColor = APP_PRIMARY_COLORในชื่อผู้แทนสิ่งนี้จะใช้ไม่ได้
Mehul Thakkar

60

เป็นไปได้ที่จะซ่อนปุ่มไว้ในตำแหน่งโดยไม่เปลี่ยนความกว้างหรือลบออกจากแถบ หากคุณตั้งค่ารูปแบบเป็นธรรมดาให้ลบชื่อและปิดการใช้งานปุ่มมันจะหายไป หากต้องการคืนค่าเพียงย้อนกลับการเปลี่ยนแปลงของคุณ

-(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;
    }
}

2
สิ่งนี้ใช้ได้สำหรับฉันโดยเพียงแค่ตั้งค่า btn.title = nil ฉันกำลังเปิดใช้งานการตั้งค่า = ไม่เช่นกันในกรณี ...
Pork 'n' Bunny

3
การตั้งค่า buttonItem.title เป็นศูนย์ไม่ทำงานสำหรับฉันใน iOS7 ปุ่มไม่ปรากฏขึ้นอีกครั้งเมื่อตั้งค่ากลับมา อย่างไรก็ตามสิ่งที่ทำงานได้ถูกตั้งค่า buttonItem.title = @ "";
Mark Knopper

42

ด้านล่างเป็นโซลูชันของฉันแม้ว่าฉันกำลังมองหาแถบนำทาง

navBar.topItem.rightBarButtonItem = nil;

นี่ "navBar" เป็น IBOutlet ต่อ NavigationBar ในมุมมองใน XIB ที่นี่ฉันต้องการซ่อนปุ่มหรือแสดงตามเงื่อนไขบางประการ ดังนั้นฉันกำลังทดสอบเงื่อนไขใน "If" และถ้าจริงฉันกำลังตั้งค่าปุ่มเป็นศูนย์ในเมธอด viewDidLoad ของมุมมองเป้าหมาย

สิ่งนี้อาจไม่เกี่ยวข้องกับปัญหาของคุณ แต่มีสิ่งที่คล้ายกันเกิดขึ้นถ้าคุณต้องการซ่อนปุ่มบน NavigationBar


หากคุณต้องการตั้งค่าในภายหลังrightBarButtonItemอีกครั้งตรวจสอบให้แน่ใจว่ารายการปุ่มถูกเก็บไว้ในIBOutlet ที่แข็งแกร่งเพื่อไม่ให้ปล่อยเมื่อคุณนำมันออกจากแถบนำทาง
Nate

30

สำหรับ 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


2
แต่นี่จะใช้พื้นที่สำหรับปุ่มนี้
Makalele

22

ฉันกำลังใช้งาน OS X Yosemite Developer Preview 7 และ Xcode 6 beta 6 ที่กำหนดเป้าหมายเป็น iOS 7.1 และวิธีแก้ไขปัญหาต่อไปนี้ใช้งานได้ดีสำหรับฉัน:

  • สร้างทางออกสำหรับUINavigationItemและUIBarButtonItems
  • เรียกใช้รหัสต่อไปนี้เพื่อลบ

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • เรียกใช้รหัสต่อไปนี้เพื่อเพิ่มปุ่มอีกครั้ง

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];

ขอบคุณนี่เป็นวิธีที่ดีที่สุดที่ฉันเคยพบเช่นกัน เพียงให้แน่ใจว่าการอ้างอิงถึงปุ่มของคุณนั้นแข็งแกร่ง
jyoung

นอกจากนี้โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะเมื่อคุณมีปุ่มเดียวเท่านั้น ตัวอย่างจะลบปุ่มทั้งหมดที่ด้านข้าง
lnafziger

@jyoung มันใช้งานได้สำหรับฉัน แต่ทำไมมันถึงสำคัญถ้าการอ้างอิงนั้นแข็งแกร่ง? ฉันไม่ได้ลองวิธีอื่น แต่มักจะไม่ตั้งค่าแบบนั้นเนื่องจากไม่ใช่ค่าเริ่มต้น
Robert

@Robert คุณต้องการใช้วัตถุในภายหลังดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าวัตถุไม่ได้รับการเก็บขยะเมื่อคุณตั้งค่าเป็นศูนย์ หากไม่มีสิ่งอื่นใดที่เก็บวัตถุเมื่อคุณบอกรายการปุ่มแถบมันก็โอเคที่จะกำจัดมันมันนับการอ้างอิงจะเป็น 0 และมันจะเก็บขยะ
jyoung

14

ฉันใช้ IBOutlets ในโครงการของฉัน ดังนั้นทางออกของฉันคือ:

@IBOutlet weak var addBarButton: UIBarButtonItem!

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

และเมื่อคุณจะต้องแสดงแถบนี้อีกครั้งให้ตั้งค่าคุณสมบัติที่กลับด้าน

ในSwift 3 ให้enableใช้isEnableคุณสมบัติแทน



12

iOS 8 UIBarButtonItem พร้อมรูปภาพที่กำหนดเอง พยายามหลายวิธีส่วนใหญ่ไม่ได้ช่วย วิธีการแก้ปัญหาของแม็กซ์setTintColorก็ไม่เปลี่ยนเป็นสีใด ๆ ฉันคิดออกเองนี้คิดว่ามันจะมีประโยชน์กับบางคน

สำหรับการซ่อน:

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

สำหรับการแสดง:

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

9

ลองในSwiftอย่าอัปเดตtintColorถ้าคุณมีการออกแบบบางอย่างสำหรับ UIBarButtonItem ของคุณเช่นขนาดตัวอักษรใน AppDelegate มันจะเปลี่ยนลักษณะที่ปรากฏของปุ่มของคุณทั้งหมดเมื่อปรากฏขึ้น

ในกรณีที่มีปุ่มข้อความการเปลี่ยนชื่อสามารถทำให้ปุ่มของคุณ 'หายไป'

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

7

ผมค้นพบริ้วรอยอีกในtintColorและisEnabledแนวทางการแนะนำโดยแม็กซ์และอื่น ๆ - เมื่อ VoiceOver เปิดใช้งานสำหรับการเข้าถึงและปุ่มเหตุผลซ่อนเคอร์เซอร์การเข้าถึงจะยังคงมุ่งเน้นไปที่ปุ่มบาร์และรัฐว่ามันคือ "จาง" (คือเพราะisEnabledมี ตั้งค่าเป็นเท็จ) วิธีการในคำตอบที่ได้รับการยอมรับไม่ได้รับผลข้างเคียงนี้ แต่สิ่งอื่นที่ฉันพบคือการตั้งค่าisAccessibilityElementเป็นเท็จเมื่อ "ซ่อน" ปุ่ม:

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

จากนั้นตั้งค่าisAccessibilityElementกลับเป็นจริงเมื่อ "แสดง" ปุ่ม:

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

การมีรายการปุ่มบาร์ยังคงใช้พื้นที่ไม่เป็นปัญหาในกรณีของฉันเนื่องจากเราซ่อน / แสดงรายการปุ่มบาร์ทางด้านซ้ายสุด


6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}

และตอนนี้ก็เปลี่ยนisHiddenคุณสมบัติ


5

ปรับปรุงจาก @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

เพียงแค่ตั้งค่า barButton.customView = UIView()และดูเคล็ดลับ


สิ่งที่คำตอบนี้ทำคืออนุญาตให้ปรับขนาดได้อย่างยืดหยุ่นทั้งหมด จริงๆแล้วมันเป็นคำตอบที่มีประสิทธิภาพมาก อาจเป็นไปได้กับการขยายมันจะสมบูรณ์แบบ
Adrian_H

4

ไม่มีวิธี "ซ่อน" UIBarButtonItem คุณต้องลบออกจาก superView และเพิ่มกลับเมื่อคุณต้องการแสดงอีกครั้ง


นี่ไม่จริง - วิธีการที่ Max อธิบายไว้นั้นใช้ได้ดี
Northernman

1
nothernman - Max ไม่ถูกต้องจริง เขาไม่ได้ซ่อนปุ่มในแบบที่คนส่วนใหญ่จะนิยาม "ซ่อน" เขาเพียง แต่ทำให้มองไม่เห็นและปิดใช้งานการโต้ตอบกับผู้ใช้ ปุ่มยังคงอยู่ที่นั่นและกินพื้นที่ มันขึ้นอยู่กับวิธีที่คุณต้องการนิยาม "ซ่อน" ฉันเชื่อว่าจิตวิญญาณของคำถามเดิมต้องการลบ / เพิ่มจริง ๆ ไม่ใช่แค่ทำให้มองไม่เห็น
Michael Peterson

4

นี่เป็นรายการคำตอบที่ยาว แต่ในกรณีที่มีคนต้องการคัดลอกและวางเพื่อแก้ปัญหาอย่างรวดเร็วนี่คือ

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);
    }
}

ไม่เลว แต่คุณต้องให้ UINavigationItem เป็นพารามิเตอร์และไม่ใช่ UIToolbar เพราะเขาขอให้ซ่อน UIBarButtonItem ฉันปรับเปลี่ยนการทำงานของคุณเป็น: func hideToolbarItem (ปุ่ม: UIBarButtonItem, withToolbar toolbar: UINavigationItem) {var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems! toolbarButtons.removeAtIndex (toolbarButtons.indexOf (ปุ่ม)!) toolbar.setRightBarButtonItems (toolbarButtons, ภาพเคลื่อนไหว: จริง)} และนั่นใช้งานได้ดี
Kingalione

3

วิธีการหนึ่งที่จะทำคือการใช้ ทรัพย์สินของเมื่อจัดสรร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];


อย่างไรก็ตามมันจะไม่ปิดช่องว่างระหว่างปุ่มอื่น ๆ : เมื่อมันถูก "ซ่อน" จะมีพื้นที่ว่างบนแถบเครื่องมือ
lnafziger

@lnafziger ใช่มันเป็นเรื่องจริง แต่ฉันไม่ได้อ่านคำกล่าวของ OP เกี่ยวกับการปิดช่องว่างระหว่างปุ่ม แต่มันเป็นจุดที่ดีที่ควรทราบ
iNoob

1
ขอบคุณคำตอบของคุณก็มีประโยชน์เช่นกัน แต่ฉันคิดว่าคนส่วนใหญ่เมื่อพวกเขาต้องการซ่อนปุ่มบนแถบเครื่องมืออยากให้มันดูเหมือนไม่มีอยู่เลย (โดยไม่มีพื้นที่ว่าง) ถ้ามันเป็นซ้ายหรือขวามันไม่สำคัญว่า
lnafziger

จุดที่ดี, iNoob และ Inafziger - ฉันไม่ได้พูดถึงมัน แต่อย่างใด แต่ใช่ฉันต้องการที่จะไม่มีจุดที่ว่างเปล่า
Sasha

3

สำหรับเวอร์ชั่น Swift นี่คือรหัส:

สำหรับUINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil

2

การตั้งค่าสีข้อความเป็นสีใสเมื่อปิดใช้งานรายการปุ่มแถบอาจเป็นตัวเลือกที่สะอาดกว่า ไม่มีความประหลาดที่คุณต้องอธิบายในความคิดเห็น นอกจากนี้คุณไม่ต้องทำลายปุ่มดังนั้นคุณยังคงเก็บกระดานเรื่องราวที่เกี่ยวข้อง

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

จากนั้นเมื่อใดก็ตามที่คุณต้องการซ่อนรายการปุ่มบาร์คุณสามารถทำได้:

self.navigationItem.rightBarButton.enabled = NO;

มันเป็นง่อยไม่มีสถานที่ให้บริการที่ซ่อนอยู่ แต่นี้ให้ผลลัพธ์เดียวกัน


1
ฉันมีปุ่มอยู่ทางด้านขวา BarButtonItem ดังนั้นฉันจึงตั้งค่าการเปิดใช้งานเป็น NO และเปลี่ยนภาพในสถานะที่ปิดใช้งานเป็นศูนย์ ทำงานเหมือนจับใจ ... ขอบคุณ
Skywalker

ความคิดที่ยอดเยี่ยม แต่การตั้งค่าภาพเป็นโมฆะไม่ทำงานสำหรับฉันฉันต้องใส่สี่เหลี่ยมโปร่งใสเล็ก ๆ ของ 20x20 เป็นภาพ
Lena Bru

2

ในกรณีที่ UIBarButtonItem มีภาพแทนที่จะเป็นข้อความคุณสามารถทำได้เพื่อซ่อนมัน navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;


2

วิธีการช่วยเหลือบางอย่างที่ฉันคิดว่าฉันจะแบ่งปันตามคำตอบที่ยอมรับของ 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

คุณสามารถรับมุมมองและซ่อนด้วยวิธีนี้ได้อย่างง่ายดาย

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


2

นี่คือส่วนขยายที่จะจัดการกับสิ่งนี้

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

การตอบสนองของ Eli Burke ถ้าคุณUIBarButtonItemมีภาพพื้นหลังแทนชื่อคุณสามารถใช้รหัสได้:

-(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];
    }
}

0

คุณต้องจัดการกับ array.items array

นี่คือรหัสที่ฉันใช้เพื่อซ่อนและแสดงปุ่มเสร็จสิ้น หากปุ่มของคุณอยู่บนขอบสุดของแถบเครื่องมือหรือในระหว่างปุ่มอื่น ๆ ปุ่มอื่น ๆ ของคุณจะขยับดังนั้นหากคุณต้องการให้ปุ่มของคุณหายไปจากนั้นให้วางปุ่มของคุณเป็นปุ่มสุดท้ายตรงกลาง ฉันทำให้ปุ่มขยับเคลื่อนไหวเพื่อให้ได้ผลฉันชอบมันมาก

-(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

ใน IB ถ้าคุณปล่อยให้ปุ่มว่างเปล่ามันจะไม่ปรากฏขึ้น ฉันทำสิ่งนี้บ่อยครั้งในระหว่างการพัฒนาในระหว่างการอัปเดต UI หากฉันต้องการให้รายการปุ่มบาร์เพื่อให้ temp หายไปสำหรับงานสร้างโดยไม่ต้องลบมันออกและกำจัดการอ้างอิงที่ร้านออกทั้งหมด

สิ่งนี้ไม่มีผลเหมือนกันในระหว่างรันไทม์การตั้งค่าชื่อของปุ่มเป็นศูนย์จะไม่ทำให้ปุ่มทั้งหมดหายไป ขออภัยไม่ตอบคำถามของคุณ แต่อาจมีประโยชน์สำหรับบางคน

แก้ไข: เคล็ดลับนี้ใช้งานได้เฉพาะเมื่อสไตล์ของปุ่มถูกตั้งค่าเป็นแบบธรรมดา


0

ฉันจะเพิ่มวิธีการแก้ปัญหาของฉันที่นี่เพราะฉันไม่สามารถหาได้กล่าวถึงที่นี่ ฉันมีปุ่มแบบไดนามิกซึ่งภาพขึ้นอยู่กับสถานะของการควบคุมเดียว ทางออกที่ง่ายที่สุดสำหรับฉันคือการตั้งค่าภาพnilหากไม่มีการควบคุม ภาพได้รับการปรับปรุงทุกครั้งที่มีการปรับปรุงการควบคุมและนี่คือสิ่งที่ดีที่สุดสำหรับฉัน เพียงเพื่อให้แน่ใจว่าฉันยังตั้งค่าenabledให้NOไป

การตั้งค่าความกว้างเป็นค่าน้อยที่สุดไม่ทำงานบน iOS 7


0

ด้วยเครดิตแก่ @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)


วิธีนี้จะใช้งานได้หากคุณมีเพียงปุ่มเดียว แต่ถ้าคุณมีหลายปุ่มคุณจะต้องใช้วิธีการเพิ่มเติมตามคำตอบของฉัน
lnafziger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.