2010-12-12 11 views
12

私は[myButton setImage:forState:]; を使用して、私のUIButtonのためUIImageを設定し、私はそれが[[myButton imageView] setContentMode:UIViewContentModeScaleAspectFit]; を使用してcontentModeだ設定しかし、あなたがボタンをタップすると、それはUIViewContentModeScaleToFillに戻り、自分のイメージを伸ばします。UIButton(adjustsImageWhenHighlighted)

adjustsImageWhenHighlightedを使用すると、これを修正しますが、暗い効果が失われてしまいます。これは私が残したいものです。

これに対処する方法についてのご意見はありますか?この問題への

+0

私は同じ問題があります。これを回避する方法はないと思っています。 – jasongregori

答えて

2

私の解決策(おそらく効率的ではありませんが、それはあなたにハイライト効果をカスタマイズするoportunityを与え、私はそれが標準のものその後、良く見えると思う)です。もちろん

  • サブクラスUIButton。
  • プロパティを追加@property(非構造、保持)UIView * highlightView; setHighlighted画像を設定するための
  • 方法(私の方法、あなたはadjustsImageWhenHighlightedプロパティを設定することが重要異なるモードを使用することができます)

    [self setImage:image forState:UIControlStateNormal]; 
    [self setAdjustsImageWhenHighlighted:NO]; 
    
  • オーバーライド:そうのような方法:

    \- (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]; 
        } 
    } 
    

この作品私のために、しかし、より良い方法があれば、私はそれを知ってうれしく思います。あなたがどのような状態のために画像を設定後コンテンツモードを設定したときに起こる何らかの理由で

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];   
    }]; 
} 
+2

2つの問題:1. doHighlightedでimageviewを解放しない:、2. subviewWithTag:viewWithTagである必要があります。また、ヒント:doHighlightedのCGRectMake()の代わりに、:button.boundsを使用してください。それ以外は、これはうまく動作します。 – vakio

+0

本当に素晴らしい答え、ありがとう。 –

0

コンテンツモードをに設定してから、に設定すると、画像がプログラムで設定され、InterfaceBuilderでも設定されていることを確認してください。 IBでこの問題を解決するには、すべての状態に設定されているすべてのイメージを削除し、コンテンツモードを設定してからイメージを元に戻します。

それは私のためにそれを修正しました。