UIButtonイメージ+テキストIOS


129

私は必要UIButton画像&テキスト。画像は上部にあり、テキストは画像の下にあり、どちらもクリック可能でなければなりません。


これがお役に立てば幸いです。[テキストと画像の両方を備えたUiButton]を参照してください[1] stackoverflow.com/questions/4926581/… [1]:stackoverflow.com/questions/4926581/… 次に、カスタムボタンを処理するためにビューにUITapGestureRecognizerを追加できますクリック。
フマユーンガーニ

22
質問というより、要求仕様のように聞こえます。
Abizern 2012

受け入れられた回答とこのコマンド
シフトを

回答:


308

非常に複雑な答えがあり、すべてコードを使用しています。ただし、Interface Builderを使用している場合、これを行う非常に簡単な方法があります。

  1. ボタンを選択し、タイトルと画像を設定します。画像ではなく背景を設定した場合、ボタンよりも小さい場合、画像のサイズが変更されます。IB基本画像とタイトル
  2. エッジとインセットを変更して、両方のアイテムの位置を設定します。Controlセクションで両方の配置を制御することもできます。

IBポジションセット IBコントロールセット

他のソリューションが提案するようにUILabelsとUIImagesを内部に作成せずに、コードで同じアプローチを使用することもできます。常にシンプルにしてください!

編集:3つのもの(タイトル、画像、背景)が正しく挿入された小さな例を添付 ボタンのプレビュー


2
これは正しいです。タイトルと画像のエッジインセットを使用して、2つを正しく位置合わせします。これをコードで行うには、titleEdgeInsetsプロパティとcontentEdgeInsetsプロパティを設定します。
Tim Mahoney、2012

4
はい、ほぼ正しいです。のBackground代わりに画像を設定するImage必要があります。そうしないと、タイトルが表示されず、インセット値を設定してタイトルを再配置することもできません。
holex

6
私もこれで苦労しました。タイトルが表示されない場合は、負の左オフセットを設定してみてください。IBが画像の右側に自動的に押し出すように見えます。
ブライアンズ2013年

8
これは画像とテキストを並べて表示するだけですよね?上から下に向きを変える方法はありますか?これは、元の質問が述べていることであり、私が探しているものでもあります。ありがとう!
flohei 2016年

12
Xcode 8を使用している場合は、Edgeプロパティが表示されない場合があります。画像を追加した後も、テキストが消えることがあります。テキストが白に変わり、白の背景の場合は消えたように見えます。テキストの色を変更すると、画像の近くに表示されます。サイズインスペクタでインセットを調整できます。
Micah Montoya

67

私はあなたがあなたの問題のためにこの解決策探していると思います

UIButton *_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setFrame:CGRectMake(0.f, 0.f, 128.f, 128.f)]; // SET the values for your wishes
[_button setCenter:CGPointMake(128.f, 128.f)]; // SET the values for your wishes
[_button setClipsToBounds:false];
[_button setBackgroundImage:[UIImage imageNamed:@"jquery-mobile-icon.png"] forState:UIControlStateNormal]; // SET the image name for your wishes
[_button setTitle:@"Button" forState:UIControlStateNormal];
[_button.titleLabel setFont:[UIFont systemFontOfSize:24.f]];
[_button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // SET the colour for your wishes
[_button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; // SET the colour for your wishes
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, -110.f, 0.f)]; // SET the values for your wishes
[_button addTarget:self action:@selector(buttonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside]; // you can ADD the action to the button as well like

...ボタンのカスタマイズの残りの部分はあなたの義務であり、ビューにボタンを追加することを忘れないでください。

UPDATE#1およびUPDATE#2

または、動的なボタン必要ない場合は、Interface Builderのビューにボタンを追加し、そこに同じ値を設定することもできます。かなり同じですが、こちらもこのバージョンです。

スクリーンショットのように、Interface Builder最終結果確認することもできます。

ここに画像の説明を入力してください


EdgeInsetsは、「ボタン画像の設定」があり、ボタン画像を設定するとタイトルが表示されない場合にのみ機能します。また、背景画像を設定した場合、EdgeInsetsは画像に適用できません。タイトルを見ることができます。したがって、edgeinsectを同時に両方に設定することはできません。
Badal Shah

@BadalShah、はい、あなたが言ったことが真実であり、タイトル画像を同時に見ることができないため、画像が可視領域のタイトルを押し出します。しかし、そのシナリオはまったく一般的ではありません。一般的な状況は、タイトル画像の両方が同時に表示される可能性があり、同時に表示されることです。
holex

32

Xcode-9Xcode-10 AppleはEdge Insetに関していくつかの変更を行いました。サイズインスペクターで変更できます。

以下の手順に従ってください:

ステップ-1: テキストを入力し、表示したい画像を選択します:

ここに画像の説明を入力してください

手順2: 下の画像に示すように、要件に応じてボタンコントロールを選択します。

ここに画像の説明を入力してください

ステップ-3: サイズインスペクターに移動し、要件に従って値を追加します。

ここに画像の説明を入力してください


9
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.imageView.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

しかし、次のコードは上のラベルと背景の画像を表示します

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.background.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

UIButtonにはUILabelプロパティとUIimageviewプロパティがあるため、同じコントロールでラベルとボタンを使用する必要はありません。


1
私は..トップ&画像下のテキストに画像を配置する必要があり、両方のクリック可能でなければなりません
Codesen

4

このコードを使用してください:

UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.imageView.frame=CGRectMake(0.0f, 0.0f, 50.0f, 44.0f);///You can replace it with your own dimensions.
    UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 35.0f, 50.0f, 44.0f)];///You can replace it with your own dimensions.
    [button addSubview:label];

4

このコードを使用してください:

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(0, 10, 200, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] 
stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton]

4

同じ問題が発生し、次のように新しいサブクラスを作成しUIButtonlayoutSubviews:メソッドをオーバーライドすることで修正しました。

-(void)layoutSubviews {
    [super layoutSubviews];

    // Center image
    CGPoint center = self.imageView.center;
    center.x = self.frame.size.width/2;
    center.y = self.imageView.frame.size.height/2;
    self.imageView.center = center;

    //Center text
    CGRect newFrame = [self titleLabel].frame;
    newFrame.origin.x = 0;
    newFrame.origin.y = self.imageView.frame.size.height + 5;
    newFrame.size.width = self.frame.size.width;

    self.titleLabel.frame = newFrame;
    self.titleLabel.textAlignment = UITextAlignmentCenter;

}

AngelGarcíaOlloquiの答えは、インターフェイスビルダーを使用してすべて手動で配置する場合の別の良い解決策だと思いますが、ボタンごとにコンテンツインセットを変更する必要がないので、私の解決策は保持します。


4

とを作成UIImageViewUILabel、イメージとテキストをこの両方に設定します。次に、imageViewとLabelの上にカスタムボタンを配置します。

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.png"]];
    imageView.frame = CGRectMake(x, y, imageView.frame.size.width, imageView.frame.size.height);
    [self.view addSubview:imageView];

UILabel *yourLabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y,a,b)];
yourLabel.text = @"raj";
[self.view addSubview:yourLabel];

UIButton * yourBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[yourBtn setFrame:CGRectMake(x, y,c,d)];
[yourBtn addTarget:self action:@selector(@"Your Action") forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:yourBtn];  

シンプルで便利。ハイライトされた画像とタイトルを設定する方法は?
DawnSong 2017

lable setHighlightedTextColorの場合、forControlEventsで遊ぶ必要があります
Rajneesh071

3

画像のカスタム画像ビューとテキストのカスタムラベルを作成し、ボタンにサブビューとして追加する必要があります。それでおしまい。

UIButton *yourButton = [UIButton buttonWithType:UIButtonTypeCustom];
yourButton.backgroundColor = [UIColor greenColor];
yourButton.frame = CGRectMake(140, 40, 175, 30);     
[yourButton addTarget:self action:@selector(yourButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:yourButton];

UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, yourButton.frame.size.width, yourButton.frame.size.height/2)];
imageView1.image =[UIImage imageNamed:@"images.jpg"];
[yourButton addSubview:imageView1];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, yourButton.frame.size.height/2, yourButton.frame.size.width, yourButton.frame.size.height/2)];
label.backgroundColor = [UIColor greenColor];
label.textAlignment= UITextAlignmentCenter;
label.text = @"ButtonTitle";
[yourButton addSubview:label];

テスト目的のために、yourButtonSelected:メソッドを使用します

-(void)yourButtonSelected:(id)sender{
    NSLog(@"Your Button Selected");

}

参考になると思います。


3

それは本当にシンプルです。ボタンの背景に画像を追加し、uicontrolstatenormalのボタンのタイトルラベルにテキストを与えるだけです。それでおしまい。

[btn setBackgroundImage:[UIImage imageNamed:@"img.png"] forState:UIControlStateNormal];
[btn setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[btn setTitle:@"Click Me" forState:UIControlStateNormal];

4
...そしてテキストは画像の下にどのように配置されますか?
holex

@holex:私を監督してくれてありがとう、私はそれに欠陥を見つけて、それに応じて変更しました。
Dhruv 2012

1

迅速なバージョン:

var button = UIButton()

newGameButton.setTitle("Новая игра", for: .normal)
newGameButton.setImage(UIImage(named: "energi"), for: .normal)
newGameButton.backgroundColor = .blue
newGameButton.imageEdgeInsets.left = -50

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.