UIButton: đặt hình ảnh cho trạng thái được tô sáng đã chọn


158

Tôi đặt hình ảnh cho các trạng thái của nút Bình thường, Nổi bật và Được chọn, nhưng khi nút ở trạng thái được chọn và tôi nhấn / tô sáng, tôi không thấy hình ảnh được tô sáng mà chỉ là hình ảnh màu xám. Có thể đặt hình ảnh cho trạng thái được tô sáng khi nút được chọn không?

mã của tôi:

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

khi tôi làm:

[button setSelected:YES];

và nhấn nút, hình ảnh "ấn.png" không chọn.


+1 Tôi có cùng một vấn đề, hy vọng sẽ có câu trả lời.
Nick Weaver

3
Xuất sắc! Ai có thể biết bạn có thể thiết lập hình ảnh cho sự kết hợp! Làm việc như một cơ duyên cho tôi!
David H

1
Tuyệt vời!!! câu hỏi của bạn là câu trả lời cho tôi ... Nó đã làm việc !!!
Kiran S

1
Nó hoạt động với tôi chỉ với UIControlStateHighlighted, nhưng tôi gọi button.adjustsImageWhenHighlighted = NO;trước.
Graham Perks

Điều này. Vì vậy, tốt hơn nhiều so với giải pháp tôi có trước đây.
Meshach

Câu trả lời:


231

Tôi tìm thấy giải pháp: cần thêm dòng bổ sung

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

5
Bất kỳ cách nào để làm điều này thông qua xây dựng giao diện?
Stephen

6
@stephen: Đặt thuộc tính "Nền" (hình ảnh) của UIButton cho các điều kiện khác nhau của "StateConfig" (Mặc định / Đánh dấu / Đã chọn / Tắt) Thuộc tính hoạt động với tôi.
Ajeet

2
Giải pháp của Ajeet không hiệu quả với tôi. Tôi cũng muốn biết một cách để làm điều đó trên IB
Lucas

3
Vì bạn không thể đặt cái này trong IB, bạn có thể đặt cái này vào phương thức viewDidLoad của bạn và nó sẽ gần như là tốt, vì sau đó bạn có thể thay đổi hình ảnh trong IB và không phải lo lắng về việc luôn cập nhật mã để khớp. [nút setImage: [nút imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood

4
Bạn có thể làm điều này trong IB. Xem ảnh chụp màn hình trong câu trả lời dưới đây!
Ríomhaire

121

Bạn có thể làm điều này trong Trình tạo giao diện.

Chọn cái UIButtonbạn muốn đặt IBsau đó đi đến attributes inspector.

Trong ảnh chụp màn hình, tôi đang sử dụng một loại nút tùy chỉnh, nhưng điều đó không thành vấn đề.

Mặc định tùy chỉnh

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


5
Tùy chỉnh hoặc hệ thống thực sự là vấn đề rất nhiều. Chơi xung quanh với cả hai và bạn sẽ thấy.
Ben Sinclair

9
Không phải trong bối cảnh của câu hỏi.
Ríomhaire

7
Điều này không trả lời câu hỏi. Ông nói rằng sự kết hợp của trạng thái được chọn + được chọn
Rafael Nobre

+1 vì tôi hoàn toàn bỏ lỡ các menu kéo xuống này (tôi thường làm mọi thứ theo chương trình cho đến gần đây ...)
Nicolas Miari

30

Swift 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])

Để thiết lập hình nền chúng ta có thể sử dụng setBackgroundImage(_:for:)

Swift 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])

Phiên bản mảng không hoạt động với tôi. (ít nhất là trong thời gian setImage)
huggie

1
iOS 10 sẽ làm mờ hình ảnh bình thường / được chọn của bạn, đẹp và trông đẹp. Nếu bạn đặt một hình ảnh được chọn, được tô sáng, nó sẽ không tự động làm mờ hình ảnh sau. Đó là một người ồn ào.
rắn

28

Tôi nghĩ rằng hầu hết các áp phích ở đây bỏ lỡ điểm hoàn toàn. Tôi đã từng gặp vấn đề tương tự. Câu hỏi ban đầu là về trạng thái Nổi bật của nút Đã chọn (COMBINING BOTH STATE) không thể được đặt trong IB và quay lại trạng thái Mặc định với một số hiện tượng tối. Chỉ có giải pháp làm việc như một bài viết đã đề cập:

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

tôi biết nhưng bằng cách nào đó tôi không được phép
alghor

1
vì một số lý do tôi vẫn gặp vấn đề ngay cả khi tôi đặt nó như trên. Cách duy nhất để tôi có được một hình ảnh tùy chỉnh cho trạng thái điều khiển của mình là chỉ đặt UIControlStateHighlighted.
Julius

12

Nếu bạn có một lý do chính đáng để làm điều đó, điều này sẽ tạo nên mánh khóe

thêm các mục tiêu này:

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

Cảm ơn vì điều này, nhưng thực sự nó quá phức tạp) Tôi hy vọng nút này sẽ hoạt động như mô tả ở trên
user478681

7

Trong Swift 3.x, bạn có thể đặt hình ảnh được tô sáng khi nút được chọn theo cách sau:

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

Trong swift bạn có thể làm:

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

2

Đúng nếu tôi đã sai lầm. Bằng cách làm

   [button setSelected:YES];

bạn đang thay đổi rõ ràng trạng thái của các nút như đã chọn. Vì vậy, một cách tự nhiên bởi mã bạn đã cung cấp hình ảnh sẽ cho trạng thái được chọn trong trường hợp của bạn được kiểm tra.png


không hoàn toàn hiểu ý của bạn là gì khi "xóa thay đổi trạng thái ...". Điều này rất đơn giản: Tôi đặt hình ảnh cho các trạng thái được mô tả ở trên, thêm hành động đích cho nút này và trong phương thức xử lý hành động của tôi (điều khiển sự kiện UIControlEventTouchUpInside) Tôi chuyển trạng thái được chọn cho nút [nút setSelected: YES / NO]. Và khi nút hiện ở trạng thái được chọn và tôi nhấn / tô sáng nó, tôi chỉ thấy hình ảnh màu xám, giống như không có thiết lập hình ảnh cho trạng thái này.
user478681

Ý tôi là rõ ràng ở đó. Xin lỗi vì điều đó. Khi bạn nhấn nút đầu tiên, bạn sẽ đặt trạng thái của nó là đã chọn, để hình ảnh đó sẽ được hiển thị. Vì vậy, nếu bạn muốn chỉ có hình ảnh được làm nổi bật, hãy làm cho trạng thái của nó được tô sáng. Mặc dù vậy, tôi không chắc chắn nếu tôi nhận được bạn đúng cách
visakh7

Khi tôi nhấn nút đầu tiên, tôi nêu nó như được tô sáng và sau đó khi tôi phát hành, trạng thái sẽ được chọn (khi tôi đặt nó trong phương thức hành động của mình). Hơn tôi nhấn lại lần nữa (nút đã ở trạng thái đã chọn) và trạng thái nên được thay đổi thành tô sáng và tôi sẽ thấy hình ảnh ấn.png nhưng tôi không thấy nó trong trường hợp này.
user478681

1

Nếu ai đó tự hỏi làm thế nào điều này hoạt động trong Swift, đây là giải pháp của tôi:

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 đây là một giải pháp hiệu quả, nhưng cách Roland Keesom viết nó sạch sẽ hơn nhiều.
jungledev 7/2/2016

1

Swift 3+

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

HOẶC LÀ

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

Nó có nghĩa là nút hiện tại ở selectedtrạng thái, sau đó bạn chạm vào nó, hiển thị highlighttrạng thái.


0

Tôi gặp sự cố khi cài đặt imageView.highlighted = NO; (cài đặt hoạt động chính xác và hình ảnh được thay đổi thành hình được tô sáng).

Giải pháp đã được gọi [imageView setHighlighted:NO];

Mọi thứ hoạt động đúng.


0

Bạn muốn gọi từ đâu

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

Phương pháp:

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

Tín dụng ở trên cho Jorge nhưng tôi đã cải thiện nó một chút để đưa ra giải pháp làm việc đầy đủ


0

Xamarin C #

Làm bitwise HOẶC không hoạt động vì một số lý do

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

Các công việc sau đây

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

Nếu bạn cần màu được tô sáng mà HĐH cung cấp theo mặc định khi bạn chạm và giữ nút tùy chỉnh cho trạng thái đã chọn, hãy sử dụng lớp con UIButton này. Viết bằng Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.