UI ที่ปิดใช้งานปุ่มไม่จางหรือเป็นสีเทา


141

ในแอพ iPhone ของฉันฉันมี UIButton ที่ฉันสร้างไว้ใน Interface Builder ฉันสามารถเปิดและปิดการใช้งานได้สำเร็จเช่นนี้ในรหัสของฉัน ...

sendButton.enabled = YES;

หรือ

sendButton.enabled = NO;

อย่างไรก็ตามรูปลักษณ์ของปุ่มยังคงเหมือนเดิมเสมอ! มันไม่จางหรือเทา ถ้าฉันพยายามคลิกมันถูกเปิดหรือปิดตามที่คาดไว้ ฉันพลาดอะไรไปรึเปล่า? มันไม่ควรดูจางหรือเทา?


คุณใช้รูปภาพกับ UIButton หรือไม่?
Jhaliya

ไม่ได้คุณจะต้องตั้งค่าอัลฟาจึงจะใช้งานได้
Ravin

คำตอบ:


192

คุณสามารถใช้รหัสต่อไปนี้:

sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;

12
ในขณะที่การทำงานนี้ฉันคิดว่าการแก้ปัญหาที่เปลี่ยนรูปลักษณ์ขึ้นอยู่กับสถานะการควบคุมเช่นนี้และนี้จากด้านล่างนี้มีความคิดที่ดีมาก พวกเขาใช้กลไกในตัวเพื่อให้เกิดการเปลี่ยนแปลงอัตโนมัติแทนที่จะต้องอัปเดตรูปลักษณ์ของตัวควบคุมอย่างชัดเจนโดยขึ้นอยู่กับสถานะ
Benjohn

79

เพียงแค่เปลี่ยนการกำหนดค่าสถานะเพื่อปิดใช้งานและเลือกสิ่งที่คุณต้องการภาพพื้นหลังสำหรับสถานะปิดใช้งาน

ป้อนคำอธิบายภาพที่นี่


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

2
สิ่งนี้ใช้ไม่ได้กับสีพื้นหลังของมุมมอง ในโครงการของฉันฉันรวมคำตอบก่อนหน้านี้เข้าด้วยกัน
Anton

41

อีกทางเลือกหนึ่งคือการเปลี่ยนสีข้อความ (เป็นสีเทาอ่อนเป็นต้น) สำหรับสถานะปิดใช้งาน

ในตัวแก้ไขสตอรีบอร์ดให้เลือกDisabledจากState Configปุ่มป๊อปอัป ใช้Text Colorปุ่มป๊อปอัปเพื่อเปลี่ยนสีข้อความ

ในรหัสให้ใช้-setTitleColor:forState:ข้อความ


ดูเหมือนจะเป็นทางออกที่ดีกว่าคำตอบที่ยกเว้นของการปรับอัลฟ่า ฉันลงคะแนนเมื่อหลายเดือนก่อนแล้วและตอนนี้ฉันกลับมาที่นี่พร้อมกับปัญหาเดิมฉันหวังว่าฉันจะทำมันได้อีกครั้ง!
Benjohn

ใช่ดูเหมือนจะเป็นวิธีแก้ปัญหาที่ใช้ได้ผล ฉันแค่ใช้สีเทาอ่อน
atereshkov

23

ลองตั้งค่ารูปภาพต่างๆสำหรับUIControlStateDisabled(ภาพสีเทาที่ปิดใช้งาน) และUIControlStateNormal(ภาพปกติ) เพื่อให้ปุ่มสร้างสถานะปิดใช้งานสำหรับคุณ


2
เขาไม่ได้ใช้ภาพ - [ UIButton setAttributedTitle:forState:]แต่คุณสามารถใช้แนวคิดเดียวกันนี้ สร้างสตริงที่เป็นแหล่งที่มาของคุณโดยที่สีพื้นหน้าของข้อความของคุณถูกกำหนดเป็นสีโปร่งใส
nielsbot

21

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

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

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

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

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}

13

หากคุณใช้ปุ่มข้อความคุณสามารถใส่เข้าไปใน viewDidLoad วิธีการอินสแตนซ์ได้

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

ตัวอย่าง:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];

1
นี่ควรเป็นคำตอบที่ยอมรับสำหรับปุ่มข้อความ .. คำตอบที่ยอมรับในปัจจุบันเหมาะสำหรับปุ่มรูปภาพ สิ่งที่ได้รับจากความคิดเห็นของ op คือเขามีปุ่มข้อความ ..
Ali Hus

11

คุณสามารถใช้adjustsImageWhenDisabledซึ่งเป็นคุณสมบัติของUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

เช่น:

 Button.adjustsImageWhenDisabled = false

2
มันทำอะไร? คุณสามารถอธิบายได้ไหมว่าทำไมเขาถึงใช้สิ่งนั้น?
Zippy

7

นี่เป็นคำถามที่ค่อนข้างเก่า แต่มีวิธีง่ายๆในการบรรลุเป้าหมายนี้

myButton.userInteractionEnabled = false

การดำเนินการนี้จะปิดใช้งานรูปแบบการสัมผัสโดยไม่เปลี่ยนลักษณะของปุ่ม




5

ตั้งค่าtitle colorสำหรับสถานะต่างๆ:

@IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 0.3), for: .disabled)
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 1), for: .normal)
        }
    }

การใช้งาน: (สีข้อความจะเปลี่ยนโดยอัตโนมัติ)

loginButton.isEnabled = false

ป้อนคำอธิบายภาพที่นี่


4

สร้างส่วนขยายใน Swift> 3.0 แทนที่จะเป็นปุ่มแต่ละปุ่มด้วยตัวเอง

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}

3

คุณสามารถใช้ทั้งสองคำตอบแรกและจะได้ผลลัพธ์ที่ดีกว่า

ในตัวตรวจสอบแอตทริบิวต์ (เมื่อคุณกำลังเลือกปุ่ม) ให้เปลี่ยนการกำหนดค่าสถานะเป็นปิดใช้งานเพื่อตั้งค่าภาพใหม่ที่จะปรากฏขึ้นเมื่อปิดใช้งาน (ลบเครื่องหมายในการตรวจสอบเนื้อหา -> เพื่อปิดใช้งาน) .

และเมื่อคุณเปลี่ยนสถานะเป็นเปิดใช้งานรูปภาพจะโหลดจากสถานะนี้

การเพิ่มลอจิกอัลฟานี้เป็นรายละเอียดที่ดี


2

ฉันติดปัญหาเดิม ๆ การตั้งค่าอัลฟ่าไม่ใช่สิ่งที่ฉันต้องการ

UIButtonมี " ภาพพื้นหลัง " และ " สีพื้นหลัง " สำหรับรูปภาพUIButtonมีคุณสมบัติเป็น

@property (nonatomic) BOOL adjustsImageWhenDisabled

และภาพพื้นหลังจะจางลงเมื่อปิดใช้งานปุ่ม สำหรับสีพื้นหลังการตั้งค่าอัลฟ่าวิธีการแก้ปัญหาของ Ravin ก็ใช้ได้ดี

ขั้นแรกคุณต้องตรวจสอบว่าคุณได้ยกเลิกการทำเครื่องหมายที่ช่อง "ปิดใช้งานการปรับภาพ" ในยูทิลิตี้ - คุณสมบัติ
จากนั้นตรวจสอบสีพื้นหลังของปุ่มนี้

(หวังว่าจะเป็นประโยชน์นี่เป็นโพสต์เก่าอาจมีการเปลี่ยนแปลงใน Xcode)


1

ดูเหมือนว่าโค้ดต่อไปนี้จะใช้ได้ดี แต่ในบางกรณีก็ไม่ได้ผล

sendButton.enabled = NO;
sendButton.alpha = 0.5;

หากโค้ดด้านบนใช้ไม่ได้โปรดใส่ไว้ใน Main Thread ดังนั้น

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

ถ้าคุณไปด้วยความรวดเร็วเช่นนี้

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

นอกจากนี้หากคุณปรับแต่ง UIButton ให้เพิ่มสิ่งนี้ลงในคลาส Button

override var isEnabled: Bool {
    didSet {
        DispatchQueue.main.async {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
        }
    }
}

ขอบคุณและสนุกกับการเขียนโค้ด !!!


1

หากUIButtonอยู่ในสถานะรวมของselectedและdisabledสถานะของมันคือUIControlStateSelected | UIControlStateDisabledรัฐของมันคือ

ดังนั้นจึงต้องปรับสถานะเช่นนี้:

[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];

แนวทางหนึ่งคือคลาสย่อยUIButtonดังนี้:

@implementation TTButton
- (void)awakeFromNib {
   [super awakeFromNib];

    //! Fix behavior when `disabled && selected`
    //! Load settings in `xib` or `storyboard`, and apply it again.
    UIColor *color = [self titleColorForState:UIControlStateDisabled];
    [self setTitleColor:color forState:UIControlStateDisabled];

    UIImage *img = [self imageForState:UIControlStateDisabled];
    [self setImage:img forState:UIControlStateDisabled];
}

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
    [super setTitleColor:color forState:state];

    //
    if (UIControlStateDisabled == state) {
        [super setTitleColor:color forState:UIControlStateSelected | state];
        [super setTitleColor:color forState:UIControlStateHighlighted | state];
    }
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];

    if (UIControlStateDisabled == state) {
        [super setImage:image forState:UIControlStateSelected | state];
        [super setImage:image forState:UIControlStateHighlighted | state];
    }
}

@end

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ใน Swift คุณจะต้องมีบางอย่างเช่น setTitleColor (disabledColor สำหรับ: [.disabled, .selected])
Paulo Cesar

0

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

extension UIButton {
  private func image(withColor color: UIColor) -> UIImage? {
    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()

    context?.setFillColor(color.cgColor)
    context?.fill(rect)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image
  }

  func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
    self.setBackgroundImage(image(withColor: color), for: state)
  }
}

มีเพียงปัญหาเดียวในโซลูชันนี้ - การเปลี่ยนแปลงนี้จะไม่มีผลกับปุ่มที่สร้างในสตอรีบอร์ด สำหรับฉันมันไม่ใช่ปัญหาเพราะฉันชอบสไตล์ UI จากโค้ดมากกว่า หากคุณต้องการใช้สตอรี่บอร์ดให้ใช้เวทมนตร์เพิ่มเติมด้วย@IBInspectableที่จำเป็น

ตัวเลือกที่สองคือคลาสย่อย แต่ฉันต้องการหลีกเลี่ยงสิ่งนี้


0

บางทีคุณสามารถ subclass ปุ่มของคุณและแทนที่ตัวแปร isEnabled ของคุณ ข้อดีคือสามารถใช้ซ้ำได้หลายที่

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }

-1
#import "UIButton+My.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIButton (My)


-(void)fade :(BOOL)enable{
    self.enabled=enable;//
    self.alpha=enable?1.0:0.5;
}

@end

.h:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

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