ObjectiveC - кнопка UIB остается выделенной / выделенной, а цвет фона и цвет шрифта изменяется при выделении / выделении - PullRequest
0 голосов
/ 27 августа 2018

Я использовал конструктор интерфейса для создания следующего UIButton для другого временного интервала и UIButton для Search.Я хочу, чтобы кнопка UIB для другого временного интервала оставалась выделенной / выделенной, когда пользователь нажимает на нее.И цвет фона, и цвет шрифта также изменятся (см. Рисунок для иллюстрации).Кроме того, пользователь может выбрать только один из временных интервалов за один раз.

UIButton с другим временным интервалом enter image description here

Что я пытаюсь достичь кнопка

enter image description here

Код

#import "Search.h"
#import <QuartzCore/QuartzCore.h>

@interface Search(){

}

@end

@implementation Search

@synthesize btn1;
@synthesize btn2;
@synthesize btn3;
@synthesize btn4;
@synthesize btn5;
@synthesize btn6;
@synthesize btn7;
@synthesize btn8;
@synthesize btn9;
@synthesize btnSearch;

- (void)viewDidLoad
{
    [super viewDidLoad];

    _borderBox.layer.shadowRadius  = 5;
    _borderBox.layer.shadowColor   = [UIColor colorWithRed:211.f/255.f green:211.f/255.f blue:211.f/255.f alpha:1.f].CGColor;
    _borderBox.layer.shadowOffset  = CGSizeMake(0.0f, 0.0f);
    _borderBox.layer.shadowOpacity = 0.9f;
    _borderBox.layer.masksToBounds = NO;

    btn1.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn1.layer.borderWidth =1.0f;
    btn2.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn2.layer.borderWidth =1.0f;
    btn3.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn3.layer.borderWidth =1.0f;
    btn4.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn4.layer.borderWidth =1.0f;
    btn5.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn5.layer.borderWidth =1.0f;
    btn6.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn6.layer.borderWidth =1.0f;
    btn7.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn7.layer.borderWidth =1.0f;
    btn8.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn8.layer.borderWidth =1.0f;
    btn9.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btn9.layer.borderWidth =1.0f;
}

-(void)viewWillAppear:(BOOL)animated{


}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

}

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                     (id) color.CGColor,
                     (id) color.CGColor,
                     nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                        [NSNumber numberWithFloat:0.0f],
                        [NSNumber numberWithFloat:1.0f],
                        nil];


    [button.layer addSublayer:colorLayer];

}

Ответы [ 5 ]

0 голосов
/ 03 сентября 2018

Я смог добиться функции, над которой вы работаете, и ниже я вот как это сделал.

Я создал дизайн через раскадровку и соединил все методы действий с 9 кнопками в одном методе выбора.внутри метода действия с помощью параметра help sender мы можем получить ссылку на выбранные кнопки и использовать ее.

- (IBAction)btnPressed:(UIButton*)sender {

/* Below for loop works as a reset for setting the default colour of button and to not select the same one twice*/
for (UIButton* button in buttons) {
    [button setSelected:NO];
    [button setBackgroundColor:[UIColor whiteColor]];
    [button setUserInteractionEnabled:true];
// [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
}

NSInteger tag = sender.tag;        // Here we get the sender tag, which we can use for our needs. Also we can directly use the sender and get the title or whatsoever needed.

/*Now below line works as a toggle for the button where multiple buttons can't be selected at the same time.*/
sender.selected = ! sender.selected;      

if(sender.selected)
{
/* Here we set the color for the button and handle the selected function*/
    [sender setSelected:YES];
    [sender setUserInteractionEnabled:false];
    [sender setBackgroundColor:[UIColor magentaColor]];
}
}

Вы также можете добавить пользовательский слой для кнопки, используя "sender.Layer"свойство.

Весь код добавлен ниже,

Все действия кнопки должны быть связаны с одним методом выбора, - (IBAction) btnPressed: (UIButton *) sender;

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *mainViewOL;
@property (weak, nonatomic) IBOutlet UIButton *btn1;
@property (weak, nonatomic) IBOutlet UIButton *btn2;
@property (weak, nonatomic) IBOutlet UIButton *btn3;
@property (weak, nonatomic) IBOutlet UIButton *btn4;
@property (weak, nonatomic) IBOutlet UIButton *btn5;
@property (weak, nonatomic) IBOutlet UIButton *btn6;
@property (weak, nonatomic) IBOutlet UIButton *btn7;
@property (weak, nonatomic) IBOutlet UIButton *btn8;
@property (weak, nonatomic) IBOutlet UIButton *btn9;

@end

@implementation ViewController

NSArray* buttons;

- (void)viewDidLoad {
    [super viewDidLoad];

    buttons = [NSArray arrayWithObjects:_btn1, _btn2, _btn3,_btn4,_btn5,_btn6,_btn7,_btn8,_btn9,nil];

    self.mainViewOL.layer.shadowRadius  = 5;
    self.mainViewOL.layer.shadowColor   = [UIColor colorWithRed:211.f/255.f green:211.f/255.f blue:211.f/255.f alpha:1.f].CGColor;
    self.mainViewOL.layer.shadowOffset  = CGSizeMake(0.0f, 0.0f);
    self.mainViewOL.layer.shadowOpacity = 0.9f;
    self.mainViewOL.layer.masksToBounds = NO;

    /* I Have added the 9 button's in an array and used it to reduce the lines of code and for easy understanding as well*/
    for (UIButton* button in buttons) {
        button.layer.borderColor = [UIColor lightGrayColor].CGColor;
        button.layer.borderWidth =1.0f;
    }
}

- (IBAction)btnPressed:(UIButton*)sender {
    for (UIButton* button in buttons) {
        [button setSelected:NO];
        [button setBackgroundColor:[UIColor whiteColor]];
        [button setUserInteractionEnabled:true];
     // [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];        //Based on your needs and colour variant you cant add properties to the button for different control states.
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
    }

    NSInteger tag = sender.tag;

    sender.selected = ! sender.selected;


    if(sender.selected)
    {
        [sender setSelected:YES];
        [sender setUserInteractionEnabled:false];
        [sender setBackgroundColor:[UIColor purpleColor]];
        sender.backgroundColor = [UIColor magentaColor];
    }
}

@end

И окончательный результат

Игнорировать задержку вВыбор кнопки, это вызвано преобразованием видео в gif.

Надеюсь, что это помогает.

0 голосов
/ 01 сентября 2018

Вы можете получить любую кнопку и управлять любой кнопкой через элемент управления тегами.

enter image description here

0 голосов
/ 27 августа 2018

Вы можете подготовить свой экран с помощью UICollectionView.

Создать собственный класс с UICollectionViewCell и переопределить свойство ниже.

override var isSelected: Bool `{
         willSet{
                   super.isSelected = newValue

          // put button background color value as per selected state`
0 голосов
/ 29 августа 2018

Теоретически вы можете сделать следующее:

  1. Сохранить все кнопки в массиве (переменная экземпляра)
  2. Добавить цель к каждой кнопке, которая устанавливает одну кнопку каквыбран и отменяет выбор всех других кнопок.

Функция конструктора кнопки должна выглядеть примерно так:

-(UIButton *)newButtonWithTitle:(NSString *)title fontSize:(NSInteger)fontSize {
    UIColor *selectedButtonColor = [UIColor colorWithRed:1.0 green:0.2 blue:0.2 
    alpha:0.5];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:title forState:UIControlStateNormal];
    [button setTitleColor:selectedButtonColor forState:UIControlStateHighlighted];
    [button setTitleColor:selectedButtonColor forState:UIControlStateSelected];
    button.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightRegular];
    button.layer.borderColor = [UIColor lightGrayColor].CGColor;
    button.layer.borderWidth = 1.0;

    [button addTarget:self action:@selector(scheduleButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    return button;
}

Функция действия кнопки может быть:

-(void)scheduleButtonAction:(UIButton *)button {
    button.selected = YES;
    [self.buttons enumerateObjectsUsingBlock:^(UIButton *aButton, NSUInteger idx, BOOL * _Nonnull stop) {
        if (![aButton isEqual:button]) {
            aButton.selected = NO;
        }
    }];
}

НО Я бы так не поступил.Проблема с этим решением заключается в том, что пока это возможно, это не Apple, и это определенно не элегантное решение.

Здесь есть несколько проблем:

  1. КакВы связываете данные между каждой кнопкой и значением, которое она представляет?Вы можете сделать это, используя ассоциативные объекты ИЛИ, создав подкласс UIButton и добавив свойство ИЛИ, используя теги и таблицу поиска.Все это не очень хорошие решения.

  2. Эта конструкция жестко закодирована и не является гибкой.Существует много стандартного кода для создания кнопок, и вы должны отслеживать все эти свойства.

  3. Что вы будете делать, если требование изменится и вам потребуется кнопка для каждого часа дня?

Aлучший способ сделать этот макет, о котором намекнул пользователь10277996, это использовать представление коллекции.Это позволит вам разделить проблемы:

  1. источник данных, где вы решаете, сколько кнопок (ячеек) следует создать (и какие данные они должны содержать)
  2. класс конструкторадля ячейки, где вы определяете дизайн один раз .
  3. класс макета, где вы определяете, как раскладывать свои кнопки.

Вы должны занять деньили два и познакомьтесь с UICollectionView, так как это один из самых мощных и полезных классов в iOS.

Вот руководство для начала: https://www.raywenderlich.com/975-uicollectionview-tutorial-getting-started

Официальная документация Apple:https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40012334-CH1-SW1

Если вы хотите копать глубже, ознакомьтесь со следующими ресурсами (хотя и не обязательно для решения вашей конкретной проблемы): https://www.objc.io/issues/3-views/collection-view-layouts/ https://ashfurrow.com/uicollectionview-the-complete-guide/

0 голосов
/ 27 августа 2018

Попробуйте использовать кнопку пользовательского типа.

UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];

Или установите это свойство в Интерфейсном Разработчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...