Objective-C在选中/未选中时突出显示UIButton

时间:2016-06-07 21:31:32

标签: ios objective-c uibutton

我在UIView里面有一个UIButton,当选择UIButton时我想要一个深灰色的背景颜色......这可能吗?

UIView *toolbar = [[UIView alloc]initWithFrame:CGRectMake(10, 50, 40, 160)];
    [toolbar setBackgroundColor:[UIColor colorWithWhite: 0.70 alpha:0.5]];

    toolbar.layer.cornerRadius = 5;

    UIButton *penTool = [UIButton buttonWithType:UIButtonTypeCustom];
    penTool.frame = CGRectMake(5, 0, 30, 30);
    [penTool setImage:[UIImage imageNamed:@"pen-but" inBundle:currentBundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal];
    [penTool addTarget:self action:@selector(drawButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    penTool.autoresizingMask = UIViewAutoresizingNone;
    penTool.exclusiveTouch = YES;
    penTool.tag = 1;

    [toolbar addSubview:penTool];

9 个答案:

答案 0 :(得分:7)

如果可以这样做怎么办?

    success: function(data) {
        console.log(data);
        image_list = data.images;
        category = data.category;
        for (var i=0; i<image_list.length; i++) {
            var img = document.createElement("img");
            img.onload = function(){
                var actualW = this.naturalWidth;
                var actualH = this.naturalHeight;
                console.log(actualW, actualH)
                var newSize = scaleSize(300, 300, actualW, actualH);
                console.log(newSize)
                this.width = newSize[0];
                this.height = newSize[1];
                //also think what to do with images which are already there
                //probably remove
                document.getElementById('imageDiv').appendChild(this)
            };//img.onload
            img.src = "static/products/"+category+"/"+image_list[i];
        }//for
    },//success

让我们为每个州提供一个很棒的API,而不仅仅是选择,就像UIButton默认API能够更改每个州的图像和标题一样。

BGButton.h

[button setBackgroundColor:[UIColor greenColor] 
                  forState:UIControlStateSelected];

BGButton.m

#import <UIKit/UIKit.h>

@interface BGButton : UIButton

- (void)setBackgroundColor:(UIColor *)backgroundColor 
                  forState:(UIControlState)state;

@end


您可以像使用默认的UIButton API

一样使用它
#import "BGButton.h"

@implementation BGButton {
    NSMutableDictionary *_stateBackgroundColor;
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _stateBackgroundColor = [[NSMutableDictionary alloc] init];
    }
    return self;
}


- (void)setBackgroundColor:(UIColor *)backgroundColor {
    [super setBackgroundColor:backgroundColor];

   /*
    * If user set button.backgroundColor we will set it to 
    * normal state's backgroundColor.
    * Check if state is on normal state to prevent background being 
    * changed for incorrect state when updateBackgroundColor method is called.
    */
    if (self.state == UIControlStateNormal) {
        [self setBackgroundColor:backgroundColor forState:UIControlStateNormal];
    }
}

- (void)setBackgroundColor:(UIColor *)backgroundColor 
                  forState:(UIControlState)state {
    NSNumber *key = [NSNumber numberWithInt:state];
    [_stateBackgroundColor setObject:backgroundColor forKey:key];
}

/*
 * state is synthesized from other flags. So we can't use KVO 
 * to listen for state changes.
 */
- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    [self stateDidChange];
}

- (void)setEnabled:(BOOL)enabled {
    [super setEnabled:enabled];
    [self stateDidChange];
}

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self stateDidChange];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [self stateDidChange];
}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
    [self stateDidChange];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self stateDidChange];
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    [self stateDidChange];
}

- (void)stateDidChange {
    [self updateBackgroundColor];
}

- (void)updateBackgroundColor {
    NSNumber *key = [NSNumber numberWithInt:self.state];
    self.backgroundColor = [_stateBackgroundColor objectForKey:key];
}

@end

即使您使用

BGButton *button = [[BGButton alloc] init];

[button setBackgroundColor:[UIColor greenColor] 
                  forState:UIControlStateSelected];

[button setBackgroundColor:[UIColor blueColor] 
                  forState:UIControlStateHighlighted];

[button setBackgroundColor:[UIColor orangeColor] 
                  forState:UIControlStateDisabled];

您将保持安全,它将被翻译成

button.backgroundColor = [UIColor redColor];

答案 1 :(得分:2)

如果您有此代码

[self.view addSubview:toolbar];

然后只需实施 按钮选择器

-(void)drawButtonTapped:(UIButton*)button{

if (button.selected) {
    button.backgroundColor = [UIColor clearColor];
    button.selected = NO;
}else{
    button.backgroundColor = [UIColor darkGrayColor];
    button.selected = YES;
}
}

答案 2 :(得分:2)

当我们在UIButton内置内置此功能时,我不知道为什么人们会遇到这样的麻烦。您需要做的就是使用UIButtonTypeSystem全部。

[UIButton buttonWithType:UIButtonTypeSystem]

说真的,没有别的了。在屏幕截图中查看它的行为。

INTERFACE BUILDER

STORYBOARD

运行时间

SIMULATOR

想要更改颜色,请将tintColor设置为您选择的颜色。

优点

  • 涵盖动态长度的标题。不适用于所有按钮宽度。
  • 选择后,标题颜色是透明的,可以看到背景,尝试使用图像作为背景。

我们希望您至少拥有iOS7作为部署目标。 UIButtonTypeSystem引入了iOS7修订后的UI设计指南,已经存在了近3年。

祝你好运!

答案 3 :(得分:2)

我在这里使用了一个UIButton子类:

#import "CustomButton.h"

@interface CustomButton()
@property (nonatomic,strong) UIColor *originalColor;
@end

@implementation CustomButton

- (void)didMoveToSuperview
{
    self.originalColor = self.superview.backgroundColor;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.superview.backgroundColor = [UIColor grayColor];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self];
    if ([self hitTest:location withEvent:nil]) {
        self.superview.backgroundColor = [UIColor grayColor];
        self.originalColor = self.superview.backgroundColor;
    }
    else
    {
        self.superview.backgroundColor = self.originalColor;
    }
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.superview.backgroundColor = self.originalColor;    
}

@end

如果你从这个类中继承你的按钮,它应该给你想要的效果。这也为您提供了亮点效果。如果您希望可以通过删除touchesBegan上的行来禁用它。

答案 4 :(得分:0)

尝试使用以下方法覆盖UIButton ...

   - (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = [UIColor darkGray];
    }

}

答案 5 :(得分:0)

我认为你会想要改变selectedImage的灵活性而不是背景。

在项目中添加另一张图片(例如pen-but-selected)。为setImage:

添加第二行
[penTool setImage:[UIImage imageNamed:@"pen-but-selected" inBundle:currentBundle compatibleWithTraitCollection:nil] forState:UIControlStateSelected];
- (void)drawButtonTapped:(UIButton *)button {
    button.selected = !button.selected;
}

如果您仍想更改背景颜色。 @ jamil的答案会奏效。确保buttonImage具有透明部分,以便通过buttonBackground看到buttonImage

答案 6 :(得分:0)

尝试使用布尔值或其他对按钮选择状态的引用。如果你想要更密切的控制(你应该这样做以获得更好的用户体验),你也可以使用'highlightColour'以及'selectedColour'。

bool buttonIsSelected = false;

UIColor * selectedColour = [UIColor redColor];
UIColor * defaultColour = [UIColor blueColor];

UIButton * button = [UIButton new];
button.frame = CGRectMake(0,0,100,100);
button.backgroundColor = [UIColor redColor];
[self.view addSubview:button];

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

-(void)buttonTouchUp:(UIButton *)button {

    if (buttonIsSelected){
        buttonIsSelected = false;
        button.backgroundColor = defaultColour;
    } else {
        buttonIsSelected = true;
        button.backgroundColor = selectedColour;
    }
}
-(void)buttonTouchCancel:(UIButton *)button {
    button.backgroundColor = defaultColour;        
    if (buttonIsSelected){
        button.backgroundColor = selectedColour;
    }
}
-(void)buttonTouchDown:(UIButton *)button {
    button.backgroundColor = selectedColour;
}

答案 7 :(得分:0)

-(void)OnSelect:(UIButton*)button{

if (button.selected) {
    button.backgroundColor = [UIColor blue];
    button.selected = NO;
}else{
    button.backgroundColor = [UIColor darkGrayColor];
    button.selected = YES;
}
}

使用上面这将有效..

答案 8 :(得分:-1)

- (无效)buttonTapped:(的UIButton *)按钮{

button.selected =! button.selected;

if (button.selected)
    button.backgroundColor = [UIColor grayColor];

else
    button.backgroundColor = [UIColor clearColor];

}