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

и нажмите кнопку, изображение «selected.png» не выбирает.


+1 У меня такая же проблема, надеюсь, будут ответы.
Ник Уивер

3
Brilliant! Кто бы мог знать, что вы можете установить изображения для комбинаций! Работал как шарм для меня!
Дэвид Х

1
Потрясающие!!! Ваш вопрос сам по себе является ответом для меня ... Это сработало !!!
Киран S

1
Это работает для меня только с UIControlStateHighlighted, но я звоню button.adjustsImageWhenHighlighted = NO;первым.
Грэм Перкс

Это. Намного лучше, чем решение, которое у меня было раньше.
Мешах

Ответы:


231

Я нашел решение: нужно добавить дополнение строки

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

5
Любой способ сделать это через конструктор интерфейса?
Стивен

6
@stephen: Настройка свойства «Фон» (изображение) UIButton для различных условий свойства «StateConfig» (по умолчанию / выделено / выбрано / отключено) работает для меня.
Ajeet

2
Решение Аджита не сработало для меня. Я также хотел бы знать, как это сделать на IB
Лукас

3
Поскольку вы не можете установить это в IB, вы можете поместить это в свой метод viewDidLoad, и это будет почти так же хорошо, так как вы можете затем изменить изображение в IB и не беспокоиться о том, чтобы всегда обновлять код в соответствии. [кнопка setImage: [кнопка imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Дейв Вуд

4
Вы можете сделать это в IB. Смотрите скриншоты в ответе ниже!
Ríomhaire

121

Вы можете сделать это в Интерфейсном Разработчике.

Выберите то, что UIButtonвы хотите установить, IBзатем перейдите к attributes inspector.

На снимках экрана я использую пользовательский тип кнопки, но это не имеет значения.

Пользовательский По умолчанию

введите описание изображения здесь

введите описание изображения здесь


5
Custom или System на самом деле очень важны. Поиграйте с обоими, и вы увидите.
Бен Синклер

9
Не в контексте вопроса.
Ríomhaire

7
Это не отвечает на вопрос. Он говорит, что комбинация выделенного + выбранного состояния
Рафаэль Нобре

+1, потому что я полностью пропустил эти выпадающие меню (я делал все программно до недавнего времени ...)
Николас Миари

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:)

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

Версия массива не работает для меня. (по крайней мере, во время setImage)
huggie

1
iOS 10 затемнит ваши обычные / выбранные изображения, что приятно и выглядит красиво. Если вы установите выбранное выделенное изображение, оно не будет затемняться последним автоматически. Который облом.
snakeoil

28

Я думаю, что большинство постеров здесь полностью упускают из виду. У меня такая же проблема. Первоначальный вопрос был о выделенном состоянии выбранной кнопки (СОЧЕТАНИЕ ОБОИХ СОСТОЯНИЙ), которая не может быть установлена ​​в IB и возвращается к состоянию по умолчанию с некоторым затемнением. Единственное рабочее решение, как упоминалось в одном посте

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

я знаю, но мне как-то не разрешили
13

1
по какой-то причине я все еще получаю проблему, даже если я установил это как выше. Единственный способ получить пользовательское изображение для моего состояния элемента управления - установить только UIControlStateHighlighted.
Юлиус

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


2

Поправь меня, если я ошибаюсь. При выполнении

   [button setSelected:YES];

Вы четко меняете состояние кнопок по выбору. Естественно, с помощью кода, который вы предоставили, изображение будет соответствовать выбранному состоянию в вашем случае.


не до конца понимаю, что вы имеете в виду под "очисткой, изменяющей состояние ...". это очень просто: я устанавливаю изображения для состояний, описанных выше, добавляю target-action для этой кнопки и в методе, который обрабатывает моё действие (управляющее событие UIControlEventTouchUpInside), я переключаю выбранное состояние для кнопки [button setSelected: YES / NO]. И когда кнопка в данный момент находится в выбранном состоянии, и я нажимаю / выделяю ее, я вижу только серое изображение, как будто для этого состояния не было настройки изображения.
user478681

Я имел в виду ясно там. Простите за это. Когда вы сначала нажимаете кнопку, вы устанавливаете ее состояние как выбранное, чтобы изображение отображалось. Поэтому, если вы хотите получить только выделенное изображение, сделайте его состояние как выделенное. Хотя я не уверен, правильно ли я вас
понимаю

Когда я сначала нажимаю кнопку, я заявляю, что она подсвечена, а затем, когда я отпускаю ее, будет выбрано состояние (как я установил в своем методе действия). Затем я нажимаю ее еще раз (кнопка уже в выбранном состоянии), и состояние должно быть изменено на выделенное, и я должен увидеть изображение нажимаем.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 - это рабочее решение, но способ, которым Роланд Кисом написал его, намного чище.
jungledev

1

Свифт 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;
    }
}

Кредит выше Хорхе, но я немного его улучшил, дав полное рабочее решение


0

Xamarin C #

Битовое ИЛИ не работает по какой-то причине

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
            }
        }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.