UIButton: ตั้งค่าภาพสำหรับสถานะที่เลือกไว้


158

ฉันตั้งค่ารูปภาพสำหรับสถานะของปุ่มปกติไฮไลต์และที่เลือกแล้ว แต่เมื่อปุ่มอยู่ในสถานะที่เลือกและฉันกด / ไฮไลต์ฉันไม่เห็นภาพที่ไฮไลต์ แต่เป็นเพียงภาพสีเทา เป็นไปได้ไหมที่จะตั้งค่ารูปภาพสำหรับสถานะที่ถูกเน้นเมื่อปุ่มถูกเลือก?

รหัสของฉัน:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

เมื่อฉันทำ:

[button setSelected:YES];

และกดปุ่มภาพ "pressed.png" จะไม่เลือก


+1 ฉันมีปัญหาเดียวกันหวังว่าจะมีคำตอบ
Nick Weaver

3
ยอดเยี่ยม! ใครจะรู้ว่าคุณสามารถตั้งค่าภาพสำหรับชุดค่าผสม! ทำงานเหมือนเสน่ห์สำหรับฉัน!
David H

1
ที่น่ากลัว !!! คำถามของคุณคือคำตอบสำหรับฉัน ... มันใช้ได้ !!!
Kiran S

1
มันใช้งานได้สำหรับฉันด้วย UIControlStateHighlighted แต่ฉันโทรbutton.adjustsImageWhenHighlighted = NO;ก่อน
เกรแฮม Perks

นี้. ดีกว่าโซลูชันที่ฉันเคยมีมาก่อน
เมชาค

คำตอบ:


231

ฉันพบวิธีแก้ปัญหา: ต้องเพิ่มบรรทัดเพิ่มเติม

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

5
มีวิธีใดในการทำเช่นนี้ผ่านเครื่องมือสร้างอินเตอร์เฟส
สตีเฟ่น

6
@stephen: การตั้งค่าคุณสมบัติ "พื้นหลัง" (ภาพ) ของ UIButton สำหรับเงื่อนไขต่าง ๆ ของ "StateConfig" (ค่าเริ่มต้น / เน้น / เลือก / ปิดใช้งาน) คุณสมบัติทำงานสำหรับฉัน
Ajeet

2
โซลูชันของ Ajeet ไม่ได้ผลสำหรับฉัน ฉันต้องการทราบวิธีการทำเช่นนี้ใน IB
Lucas

3
เนื่องจากคุณไม่สามารถตั้งค่านี้ใน IB คุณสามารถวางไว้ในวิธี viewDidLoad ของคุณและมันจะเกือบจะดีเนื่องจากคุณสามารถเปลี่ยนภาพใน IB และไม่ต้องกังวลกับการอัปเดตรหัสให้ตรงกันเสมอ [ปุ่ม setImage: [รูปปุ่ม ForState: UIControlStateHighlighted] สำหรับสถานะ: UIControlStateSelected | UIControlStateHighlighted];
เดฟวู้ด

4
คุณสามารถทำได้ใน IB ดูภาพหน้าจอในคำตอบด้านล่าง!
Ríomhaire

121

คุณสามารถทำได้ใน Interface Builder

เลือกUIButtonคุณต้องการที่จะตั้งอยู่ในนั้นไปที่IBattributes inspector

ในภาพหน้าจอฉันกำลังใช้ปุ่มชนิดกำหนดเอง แต่นั่นไม่สำคัญ

กำหนดเองเริ่มต้น

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

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


5
กำหนดเองหรือระบบเป็นเรื่องสำคัญมาก เล่นกับทั้งคู่แล้วคุณจะเห็น
เบ็นซินแคลร์

9
ไม่ได้อยู่ในบริบทของคำถาม
Ríomhaire

7
นี่ไม่ได้ตอบคำถาม เขากล่าวว่าการรวมกันของการเน้น + เลือกรัฐ
Rafael Nobre

+1 เพราะฉันพลาดเมนูแบบเลื่อนลงทั้งหมด (ฉันเคยทำทุกอย่างทางโปรแกรมจนกระทั่งเมื่อไม่นานมานี้ ... )
Nicolas Miari

30

สวิฟท์ 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

ในการตั้งค่าภาพพื้นหลังที่เราสามารถใช้ได้ setBackgroundImage(_:for:)

สวิฟท์ 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])

รุ่นอาร์เรย์ไม่ทำงานสำหรับฉัน (อย่างน้อยในระหว่างsetImage)
huggie

1
iOS 10 จะทำให้รูปภาพปกติ / ที่เลือกของคุณหรี่ลงซึ่งสวยงามและดูดี หากคุณตั้งค่าภาพที่ไฮไลต์ไว้ภาพนั้นจะไม่หรี่ลงไปโดยอัตโนมัติ ซึ่งเป็นคนเกียจคร้าน
snakeoil

28

ฉันคิดว่าโปสเตอร์ส่วนใหญ่ที่นี่พลาดจุดที่สมบูรณ์ ผมมีปัญหาเหมือนกัน. คำถามเดิมเกี่ยวกับสถานะที่ถูกเน้นของปุ่มที่เลือก (รวมทั้งสถานะ) ซึ่งไม่สามารถตั้งค่าใน IB และกลับไปสู่สถานะเริ่มต้นโดยมีการทำให้มืดลง วิธีแก้ปัญหาการทำงานเฉพาะโพสต์เดียวที่กล่าวถึง:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

ฉันรู้ แต่ฉันอย่างใดไม่ได้รับอนุญาต
alghanor

1
ด้วยเหตุผลบางอย่างฉันยังคงได้รับปัญหาแม้ว่าฉันจะตั้งค่าดังกล่าวข้างต้น วิธีเดียวที่ฉันจะได้รับภาพที่กำหนดเองสำหรับสถานะการควบคุมของฉันคือการตั้งค่า UIControlStateHighlighted เท่านั้น
Julius

12

หากคุณมีเหตุผลที่ดีที่จะทำเช่นนี้จะทำเคล็ดลับ

เพิ่มเป้าหมายเหล่านี้:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}

ขอบคุณสำหรับสิ่งนี้ แต่จริงๆแล้วมันซับซ้อนเกินไป) ฉันคาดหวังว่าปุ่มนี้จะทำงานตามที่อธิบายไว้ข้างต้น
user478681

7

ใน Swift 3.x คุณสามารถตั้งค่าภาพที่ไฮไลต์เมื่อเลือกปุ่มด้วยวิธีต่อไปนี้:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))

7

คุณสามารถทำได้อย่างรวดเร็ว:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))

2

ถูกต้องฉันถ้าฉันผิด จากการทำ

   [button setSelected:YES];

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


ไม่เข้าใจว่าคุณหมายถึงอะไรโดย "ล้างการเปลี่ยนสถานะ ... " นี่เป็นเรื่องง่ายมาก: ฉันตั้งค่ารูปภาพสำหรับสถานะที่อธิบายไว้ข้างต้นเพิ่มเป้าหมายการกระทำสำหรับปุ่มนี้และในวิธีการประมวลผลการกระทำของฉัน (ควบคุมเหตุการณ์ UIControlEventTouchUpInside) ฉันสลับสถานะที่เลือกสำหรับปุ่ม [ปุ่ม setSelected: ใช่ / ไม่] และเมื่อปุ่มปัจจุบันอยู่ในสถานะที่เลือกและฉันกด / ไฮไลต์ฉันเห็นเฉพาะภาพสีเทาเช่นไม่มีการตั้งค่าภาพสำหรับสถานะนี้
user478681

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

เมื่อฉันกดปุ่มก่อนฉันระบุว่าเป็นไฮไลต์แล้วเมื่อฉันปล่อยมันสถานะจะถูกเลือก (ตามที่ฉันตั้งไว้ในวิธีการกระทำของฉัน) กว่าที่ฉันจะกดอีกครั้ง (ปุ่มอยู่ในสถานะที่เลือก) และสถานะควรจะเปลี่ยนเป็นไฮไลต์และฉันควรจะเห็นภาพ pressed.png แต่ฉันไม่เห็นมันในกรณีนี้
user478681

1

หากมีคนสงสัยว่าสิ่งนี้ทำงานอย่างไรใน Swift นี่คือวิธีแก้ปัญหาของฉัน:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)

@ basegod นี่เป็นวิธีการทำงาน แต่วิธีที่ Roland Keesom เขียนนั้นสะอาดกว่ามาก
jungledev

1

Swift 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

หรือ

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

หมายความว่าปุ่มปัจจุบันอยู่ในselectedสถานะจากนั้นคุณสัมผัสมันแสดงhighlightสถานะ


0

ฉันมีปัญหาในการตั้งค่าimageView.highlighted = NO; (การตั้งค่าYESทำงานได้อย่างถูกต้องและภาพถูกเปลี่ยนเป็นภาพที่ไฮไลต์)

การแก้ปัญหาคือการโทร [imageView setHighlighted:NO];

ทุกอย่างทำงานอย่างถูกต้อง


0

คุณต้องการโทรจากที่ไหน

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

วิธีการ:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

เครดิตด้านบนให้กับ Jorge แต่ฉันปรับปรุงให้ดีขึ้นเล็กน้อย


0

ซามาริน C #

การทำ bitwise หรือไม่ทำงานด้วยเหตุผลบางอย่าง

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

ผลงานดังต่อไปนี้

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);

0

หากคุณต้องการโทนสีที่ไฮไลต์ซึ่งระบบปฏิบัติการจัดเตรียมไว้ตามค่าเริ่มต้นเมื่อคุณแตะค้างไว้ที่ปุ่มที่กำหนดเองสำหรับสถานะที่เลือกเช่นกันให้ใช้คลาสย่อย UIButton นี้ เขียนใน Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.