(Objective-Cの質問)UIButtonのstateがUIControlStateSelectedのとき、自動で表示される青い角丸背景を消す方法を知りたいです

投稿者: Anonymous

UIButtonにはstateによってtitleを変えることができる、[- (void)setTitle:(NSString *)title forState:(UIControlState)state]メソッドがありますが、これを使ってUIControlStateNormalのときと、UIControlStateSelectedのときと、タイトルを変えようとしています。

私は見た目としてタイトルのテキストだけを変えたいと思っているのですが、いざselectedプロパティをYESにすると、タイトルは変更されますが、青い角丸背景が自動で表示されてしまいます。この青い角丸背景を消したいです。

<試したこと>

  1. titleLabel.backgroundcolorプロパティで色を指定する。
    –> 青い角丸背景の更に奥の背景の色が変わりました。解決できません。
  2. [- (void)setBackgroundImage:(UIImage *)image
    forState:(UIControlState)state]メソッドでイメージを指定する。
    –> NormalとSelectで切り替わっているアニメーションの途中は青い角丸背景が一瞬見えますが、アニメーションが終わると指定したイメージに変わり、青い角丸背景は消えました。>ですが今回やりたいことはタイトルのみ変えたいだけなので解決できません。
  3. UIButtonのサブクラスを作り、以下のようにオーバーライドする。
    –> 何も表示されなくなってしまいました。恐らくdrawRectの中もオーバーライドする必要があるのかな。。と思ってはいるのですが、そこに手を付けると拡張というよりカスタムビューを作っているのと同じじゃないか?と思い、他に方法があるはずだと思って質問しました。

UIButtonSubClass.h

#import <UIKit/UIKit.h>

@interface UIButtonSubClass : UIButton

@end

UIButtonSubClass.m

#import "UIButtonSubClass.h"

@implementation UIButtonSubClass
{
    NSString *_normalTitle;
    NSString *_selectTitle;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.selected = NO;
    }
    return self;
}

/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect {
 // Drawing code
 }
 */

-(void)setTitle:(NSString *)title forState:(UIControlState)state
{
    if (state == UIControlStateNormal) {
        _normalTitle = title;
        self.titleLabel.text = _normalTitle;
    } else if(state == UIControlStateSelected) {
        _selectTitle = title;
    }
}

-(void)setSelected:(BOOL)selected
{
    self.selected = selected;

    if (selected) {
        self.titleLabel.text = _selectTitle;
    } else {
        self.titleLabel.text = _normalTitle;
    }
}

解決策が見つからない場合は、サブクラスも諦め、UIButtonを2つ用意して、別にselected変数も用意して、selected変数に応じて2つのUIButtonを切り替えるしかないかなぁと考えています。

まだプログラマー初心者なのでお恥ずかしい限りですが、どうかお力を貸してください。
宜しくお願いします。

解決

selectedのときにボタンのtintColorが青になるので、tintColorを設定することでそれ以外の色にすることができます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *