17157


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_

[code]

    #import <UIKit/UIKit.h>
    
    @interface UIButtonSubClass : UIButton
    
    @end
    
[/code]

_UIButtonSubClass.m_

[code]

    #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;
        }
    }
    
[/code]

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

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


CC BY-SA 3.0
2015-10-01T13:50:22.257
17148
2015-10-02T03:42:07.420
2015-10-02T01:36:35.837
3227
12528
question
ios objective-c
(Objective-Cの質問)UIButtonのstateがUIControlStateSelectedのとき、自動で表示される青い角丸背景を消す方法を知りたいです


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


CC BY-SA 3.0
2015-10-02T00:16:41.947
17157
2015-10-02T00:16:41.947
238
17148
answer


恐らく現在UIButtonのTypeをUIButtonTypeSystemで実装されているとお見受けしますが、UIButtonTypeCustomにすることでご希望されている動作を実現できそうです。

該当のUIButtonをStoryBoard(Interface
Builder)上で配置しているかどうかで若干異なる部分がありますので、両方の場合に分けて記述します。

  * ## StoryBoard上で配置する場合

[![Attributes
Inspector](https://i.stack.imgur.com/lqrpA.png)](https://i.stack.imgur.com/lqrpA.png)  
画像のように、Attributes InspectorでTypeをCustomにします。

  * ## コードで配置する場合
[code]     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    //UIButtonに関するその他の処理
    [self.view addSubview:button]; //ViewController内で記述した場合を想定。self.viewを適宜置き換えてください。
    
[/code]

  * ## 共通処理

ここからはどちらで配置したとしても共通の処理となります。  
viewDidLoad内やUIButtonの初期設定を行うタイミングで実行してください。

[code]     [button setTitle:@"通常時文字列" forState:UIControlStateNormal];

    [button setTitle:@"選択時文字列" forState:UIControlStateSelected];
    
    UIColor *buttonTextColor = [UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]; //デフォルトのボタンのカラーです。
    UIColor *buttonHilightedTextColor = [UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:0.2]; //デフォルトの動作に近づけるべくHighlighted時に設定するカラーです。
    
    [button setTitleColor:buttonTextColor forState:UIControlStateNormal];
    [button setTitleColor:buttonTextColor forState:UIControlStateSelected];
    [button setTitleColor:buttonHilightedTextColor forState:UIControlStateHighlighted];
    
[/code]

ここでミソとなるのは最後の３行で、  
TypeをUIButtonTypeCustomにしたうえで通常時／選択時両方の文字色を同じ色に設定する。  
こうすることでタップした際に文字だけ入れ替わるという動作になります。

ただし、UIButtonTypeCustomにすると厳密にはデフォルトの動作と違った印象になりますので、その点は予めご了承ください。  
（わざわざUIControlStateHighlighted時のカラーを設定しているのは、UIButtonTypeSystemの動作に近づけるためです。）


CC BY-SA 3.0
2015-10-02T03:42:07.420
17167
2015-10-02T03:42:07.420
3227
17148
answer