UIButton突出显示时忽略contentMode(adjustsImageWhenHighlighted)

时间:2010-12-12 02:44:32

标签: image ios uibutton scaling contentmode

我使用[UIImage为我的UIButton设置myButton setImage:forState:]; 我使用contentMode设置[[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; 但是当你点击按钮时,它会回到UIViewContentModeScaleToFill并伸出我的图像。

使用adjustsImageWhenHighlighted解决了这个问题,但随后我放弃了暗影效果,我想保留它。

有关如何应对此问题的任何建议吗?

3 个答案:

答案 0 :(得分:4)

UIButton *imageBtn = [UIButton ...
imageBtn.adjustsImageWhenHighlighted = NO;

[imageBtn addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside];

[imageBtn addTarget:self action:@selector(doHighlighted:) forControlEvents:UIControlEventTouchDown];
[imageBtn addTarget:self action:@selector(doHighlighted:) forControlEvents:UIControlEventTouchDragEnter];
    [imageBtn addTarget:self action:@selector(doCancelHighlighted:) forControlEvents:UIControlEventTouchDragExit];

-(void)doSomething:(UIButton *)button{
    ...
    [self performSelector:@selector(doCancelHighlighted:) withObject:button afterDelay:0.2f];
}

-(void)doHighlighted:(UIButton *)button{
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 300, 300)];
    imageView.backgroundColor = [UIColor blackColor];
    imageView.alpha = 0.7;
    imageView.tag = 1000;
    [button addSubview:imageView];
}

-(void)doCancelHighlighted:(UIButton *)button{
    UIView *view = [button subviewWithTag:1000];
    [UIView animateWithDuration:0.2f animations:^{
        view.alpha = 0;
    } completion:^(BOOL finished) {
        [view removeFromSuperview];        
    }];
}

答案 1 :(得分:2)

我对这个问题的解决方案(可能效率不高但是它给你一个机会来定制高亮效果,我觉得它看起来比标准效果更好)是:

  • 当然是UIButton的子类。
  • 添加属性@property(非原子,保留)UIView * highlightView;
  • 设置图像的方法(我的方法,你可以使用重要的不同模式来设置adjustsImageWhenHighlighted属性)

    [self setImage:image forState:UIControlStateNormal];
    [self setAdjustsImageWhenHighlighted:NO];
    
  • 覆盖setHighlighted:方法如下:

    \- (void)setHighlighted:(BOOL)highlighted {
        if (!highlightView) {
            self.highlightView = [[[UIView alloc] initWithFrame:self.bounds] autorelease];
            self.highlightView.backgroundColor = [UIColor darkGrayColor];
            self.highlightView.alpha = 0.0;
            [self addSubview:self.highlightView];
        }
        if (highlighted) {
            [UIView beginAnimations:@"highlight" context:nil];
            [UIView setAnimationDuration:0.2];
            highlightView.alpha = 0.5;
            [UIView commitAnimations];
        }
        else {
            [UIView beginAnimations:@"highlight" context:nil];
            [UIView setAnimationDuration:0.2];
            highlightView.alpha = 0.0;
            [UIView commitAnimations];
        }
    }
    

这对我有用,但如果有更好的方法,我很乐意去了解它。

答案 2 :(得分:0)

出于某种原因,在为设置任何状态的图像后设置内容模式时会发生这种情况。

确保在设置图像之前设置内容模式,以编程方式设置图像,并在InterfaceBuilder上设置。要在IB上修复此问题,请确保删除为所有状态设置的所有图像,设置内容模式,然后重新放回图像。

为我修好了。