Button文字(titleLabel)と画像(imageView)の上下配列を実現
4302 ワード
1、私は最初にこの採用方法を実現しました:1つのviewを再カスタマイズして、それから2つの属性labelとimageViewがあって、それから位置のレイアウトを設定して、更にクリックジェスチャーを追加して、エージェントでクリック方法を返信します.
2、第2の方法:1つのButtonをカスタマイズしてButtonを継承し、2つの属性labelとimageViewがあり、レイアウトを設定します.これにより、クリックジェスチャーを追加する必要がなくなります.
3、第三の方法:Buttonが持っているtitleLabelとimageViewを直接使って、Categoryを書いて、labelとimageの配列方式を設定して、eg:上下、左右
明らかに前の2つはよくないので、ここでは3つ目だけを言います.
Buttonには2つのプロパティがあります.titleEdgeInsetsとimageEdgeInsetsです.この2つを設定することで、imageが上、imageが下、imageが左、imageが右など、必要なすべてのButtonのスタイルを実現できます.
この2つを設定する前に、Buttonの上のtitleLabelとimageViewの位置関係を理解します(Buttonのデフォルトのimageとlabelの表示を想像します): titleEdgeInsetsはtitleLabelの上下左右のinsetに対してtableViewのcontentInsetと類似している. titleのみであれば、titleLabelの上下左右はButtonに対するものである. imageだけなら、imageViewの上下左右はButtonに対するものです. imageとlabelが同時に存在する場合、imageの上下左はButtonに対し、右はlabelに対してである.Labelの上下右はButtonに対して、左はlabelに対してです.
理解して、それから私たちは次のコードを理解することができます. ButtonのCategoryを作成します.hファイルは、imageとlabelのスタイルを決定するためにEnumを定義する.設定を呼び出す方法です. .mファイルは以下の通り、実装方法
私はDemoをgithubに書いて、住所:カスタムButton
UIButtonのtitleEdgeInsets属性とimageEdgeInsets属性実現画像文字は要求通りに並べられていますが、このブログでは上記の原理を紹介していますので、よく見ることをお勧めします.理解してから がわかります. UIButtonのimageEdgeInsetsとtitleEdgeInsets、このブログの末尾にgithubアドレスがありますが、私が書いたときは原理が理解できなかったので、設定するときは、彼のコード を参照しました ImageとTitleを含むUIButtonをどのようにレイアウトするか、この記事は私が最初に参考にしたもので、コードだけで、原理はありません
2、第2の方法:1つのButtonをカスタマイズしてButtonを継承し、2つの属性labelとimageViewがあり、レイアウトを設定します.これにより、クリックジェスチャーを追加する必要がなくなります.
3、第三の方法:Buttonが持っているtitleLabelとimageViewを直接使って、Categoryを書いて、labelとimageの配列方式を設定して、eg:上下、左右
明らかに前の2つはよくないので、ここでは3つ目だけを言います.
Buttonには2つのプロパティがあります.titleEdgeInsetsとimageEdgeInsetsです.この2つを設定することで、imageが上、imageが下、imageが左、imageが右など、必要なすべてのButtonのスタイルを実現できます.
この2つを設定する前に、Buttonの上のtitleLabelとimageViewの位置関係を理解します(Buttonのデフォルトのimageとlabelの表示を想像します):
上の段落は重要です
理解して、それから私たちは次のコードを理解することができます.
#import
typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
MKButtonEdgeInsetsStyleTop, // image ,label
MKButtonEdgeInsetsStyleLeft, // image ,label
MKButtonEdgeInsetsStyleBottom, // image ,label
MKButtonEdgeInsetsStyleRight // image ,label
};
@interface UIButton (ImageTitleSpacing)
/**
* button titleLabel imageView ,
*
* @param style titleLabel imageView
* @param space titleLabel imageView
*/
- (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space;
#import "UIButton+ImageTitleSpacing.h"
@implementation UIButton (ImageTitleSpacing)
- (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space
{
// 1. imageView titleLabel 、
CGFloat imageWith = self.imageView.frame.size.width;
CGFloat imageHeight = self.imageView.frame.size.height;
CGFloat labelWidth = 0.0;
CGFloat labelHeight = 0.0;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// iOS8 titleLabel size 0,
labelWidth = self.titleLabel.intrinsicContentSize.width;
labelHeight = self.titleLabel.intrinsicContentSize.height;
} else {
labelWidth = self.titleLabel.frame.size.width;
labelHeight = self.titleLabel.frame.size.height;
}
// 2. imageEdgeInsets labelEdgeInsets
UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
// 3. style space imageEdgeInsets labelEdgeInsets
switch (style) {
case MKButtonEdgeInsetsStyleTop:
{
imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
}
break;
case MKButtonEdgeInsetsStyleLeft:
{
imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
}
break;
case MKButtonEdgeInsetsStyleBottom:
{
imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
}
break;
case MKButtonEdgeInsetsStyleRight:
{
imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
}
break;
default:
break;
}
// 4.
self.titleEdgeInsets = labelEdgeInsets;
self.imageEdgeInsets = imageEdgeInsets;
}
私はDemoをgithubに書いて、住所:カスタムButton