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

і натисніть кнопку, зображення "натиснуто.png" не вибереться.


+1 У мене така ж проблема, сподіваюся, що відповіді знайдуться.
Нік Вівер

3
Блискуче! Хто б коли-небудь знав, що ви можете встановити зображення для комбінацій! Працювало як шарм для мене!
Девід Н

1
Дивовижно !!! ваше запитання саме для мене відповідає ... Це спрацювало !!!
Кіран S

1
Для мене це працює лише з UIControlStateHighlight, але я зателефоную button.adjustsImageWhenHighlighted = NO;спочатку.
Грем Перкс

Це. Настільки краще, ніж рішення, яке я мав раніше.
Мешач

Відповіді:


231

Я знайшов рішення: потрібно додати рядок додавання

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

5
Будь-який спосіб зробити це за допомогою конструктора інтерфейсів?
Стівен

6
@stephen: Встановлення властивості "Фон" (зображення) UIButton для різних умов "StateConfig" (за замовчуванням / виділеним / вибраним / відключеним) Властивість працює для мене.
Ajeet

2
Рішення Ajeet для мене не спрацювало. Я також хотів би дізнатися, як це зробити на IB
Лукас

3
Оскільки ви не можете встановити це в IB, ви можете помістити це у свій метод viewDidLoad, і це буде майже так само добре, оскільки потім ви можете змінити зображення в ІБ і не потрібно турбуватися про те, щоб завжди оновити код на відповідність. [set setImage: [зображення кнопкиForState: UIControlStateHighlight] forState: UIControlStateSelected | UIControlStateHighlight];
Дейв Вуд

4
Це можна зробити в ІБ. Дивіться скріншоти у відповіді нижче!
Ríomhaire

121

Це можна зробити в Interface Builder.

Виберіть UIButtonпотрібне місце IBта перейдіть до attributes inspector.

У знімках екрана я використовую спеціальний тип кнопки, але це не має значення.

Користувацький за замовчуванням

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

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


5
Користувальницька або система насправді має велике значення. Пограйте з обома, і ви побачите.
Бен Сінклер

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

Швидкий 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 затьмарить ваші звичайні / вибрані зображення, що приємно і добре виглядає. Якщо встановити вибране, виділене зображення, воно автоматично не затьмарить останнє. Який облом.
зміїне масло

28

Я думаю, що більшість плакатів тут повністю пропускають суть. У мене була така ж проблема. Початкове запитання стосувалося виділеного стану вибраної кнопки (КОМБІНУВАННЯ ДЕРЖАВНИХ ДЕРЖАВ), яку неможливо встановити в ІБ та повертається до стану за замовчуванням з деяким потемнінням. Тільки робоче рішення, як згадується одна посада:

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

я знаю, але мене якось не дозволено
alghanor

1
чомусь я все-таки отримую проблему, навіть якщо я встановив її як вище. Єдиний спосіб отримати власне зображення для мого стану управління - встановити лише UIControlStateHighlight.
Юлій

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

ви чітко змінюєте стан кнопок, як вибрано. Отже, природно за наданим вами кодом зображення буде таким, що для обраного стану у вашому випадку перевіряється.png


не до кінця розумію, що ви маєте на увазі під "очищенням зміни держави ...". це дуже просто: я встановлюю зображення для описаних вище станів, додаю цільову дію для цієї кнопки і в методі, який обробляє мою дію (керуюча подія UIControlEventTouchUpInside), я перемикаю вибраний стан для кнопки [кнопка setSelected: YES / NO]. І коли кнопка наразі знаходиться у вибраному стані, і я натискаю / виділяю її, я бачу лише сіре зображення, як би не було налаштування зображення для цього стану.
користувач478681

Я там мав на увазі чітко. Вибачте за це. При першому натисканні кнопки ви встановлюєте її стан як вибране, так що зображення відображатиметься. Тож якщо ви хочете отримати лише виділене зображення, зробіть його стан максимально виділеним. Я не впевнений, хоч, якщо я вас
довідаюся

Коли я натискаю кнопку спочатку, я констатую її як виділену, а потім, коли відпускаю її, буде обрано стан (як я встановив його у своєму методі дій). Після чого я натискаю її ще раз (кнопка вже у вибраному стані), і стан слід змінити на виділене, і я повинен побачити зображення.
користувач478681

1

Якщо когось цікавить, як це працює у Свіфті, ось моє рішення:

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; (налаштування ТАК справно працювало, а зображення змінилось на виділене).

Рішення звучало [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.