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を定義する.設定を呼び出す方法です.
  • 
    #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;
    
  • .mファイルは以下の通り、実装方法
  • 
    #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

    リファレンス

  • UIButtonのtitleEdgeInsets属性とimageEdgeInsets属性実現画像文字は要求通りに並べられていますが、このブログでは上記の原理を紹介していますので、よく見ることをお勧めします.理解してから
  • がわかります.
  • UIButtonのimageEdgeInsetsとtitleEdgeInsets、このブログの末尾にgithubアドレスがありますが、私が書いたときは原理が理解できなかったので、設定するときは、彼のコード
  • を参照しました
  • ImageとTitleを含むUIButtonをどのようにレイアウトするか、この記事は私が最初に参考にしたもので、コードだけで、原理はありません