UIButtonのパッケージ

6172 ワード

開発ではbuttonの様々なスタイルをよく見ていますが、多重性の高いコードに対しては、それをカプセル化する必要があります.buttonには2つのコントロールtitleLabelとimageViewがありますが、この2つのコントロールの位置を変更するにはUIButtonの2つのプロパティ:setImageEdgeInsetsとsettitleEdgeInsetsを簡単に理解する必要があります.
デフォルトでは、画像は左側、テキストは右側に中央に表示されます.それらの位置も自分にとってbuttonの位置の大きさとは関係ありません.
 // , 
[btn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[btn setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

よく使われるので、画像のテキストに対する位置に基づいてパッケージ化されています.
  • は、画像またはテキストに適応するために、BooLタイプの_を設定する.AutoSize判断.
  • は、画像とテキストとの相対的な位置と、画像とテキストとを全体として上下左右にずらす
  • を設ける.
  • 以下は、デフォルトのピクチャとテキストの位置であり、その後、全体としてのオフセット位置
  • とする.
    – (void)layoutBtnSubviews{ CGSize imageSize = self.currentImage.size; CGSize titleSize = [self.titleLabel getSize];
    CGFloat maxWidth = (imageSize.width > titleSize.width) ? imageSize.width : titleSize.width;
    
    CGFloat maxHeight = (imageSize.height > titleSize.height) ? imageSize.height : titleSize.height;
    
    CGRect tempFrame = self.frame;
    
    CGFloat autoWidth = self.frame.size.width;
    CGFloat autoHeight = self.frame.size.height;
    
    
    switch (self.imageStyle)
    {
        case MMBtnImageStyleDefault: //         
        {
            switch (self.layoutStyle) // 
            {
                case MMBtnLayoutStyleNone:
                {
                    self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight);
                    if (_autoSize) // 
    
                    {
    
                        autoWidth = imageSize.width + titleSize.width + _space;
                        if (_minWidth > autoWidth)
                        {
                            autoWidth = _minWidth;
                        }
    
                        autoHeight = maxHeight;
                        if (_minHeight > autoHeight)
                        {
                            autoHeight = _minHeight;
                        }
                    }
    
                    [self setTitleEdgeInsets:UIEdgeInsetsMake(0,  _space / 2.0, 0, -_space / 2.0)];
    
                    [self setImageEdgeInsets:UIEdgeInsetsMake(0, -_space / 2.0, 0, _space / 2.0)];
                }
                    break;
                case MMBtnLayoutStyleLeft:
                {
                    self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space + _offsetMargin, maxHeight);
                    if (_autoSize)
                    {
                        autoWidth = imageSize.width + titleSize.width + _space + _offsetMargin;
                        if (_minWidth > autoWidth)
                        {
                            autoWidth = _minWidth;
                        }
    
                        autoHeight = maxHeight;
                        if (_minHeight > autoHeight)
                        {
                            autoHeight = _minHeight;
                        }
                    }
    
                    CGFloat offsetX =  (autoWidth - titleSize.width - imageSize.width) / 2.0 - _offsetMargin;
    
                    [self setTitleEdgeInsets:UIEdgeInsetsMake(0,  -offsetX + _space, 0,  offsetX - _space)];
    
                    [self setImageEdgeInsets:UIEdgeInsetsMake(0, -offsetX, 0, offsetX)];
                }
                    break;
                case MMBtnLayoutStyleRight:
                {
                    self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space + _offsetMargin, maxHeight);
                    if (_autoSize)
                    {
                        autoWidth = imageSize.width + titleSize.width + _space + _offsetMargin;
                        if (_minWidth > autoWidth)
                        {
                            autoWidth = _minWidth;
                        }
    
                        autoHeight = maxHeight;
                        if (_minHeight > autoHeight)
                        {
                            autoHeight = _minHeight;
                        }
                    }
    
                    CGFloat offsetX = - ((autoWidth - titleSize.width - imageSize.width) / 2.0 - _offsetMargin);
    
                    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, -offsetX, 0, offsetX)];
    
                    [self setImageEdgeInsets:UIEdgeInsetsMake(0, -offsetX - _space, 0, offsetX + _space)];
                }
                    break;
                case MMBtnLayoutStyleTop:
                {
                    self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight + _offsetMargin);
                    if (_autoSize)
                    {
                        autoWidth = imageSize.width + titleSize.width + _space;
                        if (_minWidth > autoWidth)
                        {
                            autoWidth = _minWidth;
                        }
    
                        autoHeight = maxHeight + _offsetMargin;
                        if (_minHeight > autoHeight)
                        {
                            autoHeight = _minHeight;
                        }
                    }
    
                    CGFloat offsetY = (autoHeight - maxHeight) / 2.0 - _offsetMargin;
    
                    [self setTitleEdgeInsets:UIEdgeInsetsMake(-offsetY , _space / 2.0, offsetY,  -_space / 2.0)];
    
                    [self setImageEdgeInsets:UIEdgeInsetsMake(-offsetY,  -_space / 2.0, offsetY, _space / 2.0)];
                }
                    break;
                case MMBtnLayoutStyleBottom:
                {
                    self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight + _offsetMargin);
                    if (_autoSize)
                    {
                        autoWidth = imageSize.width + titleSize.width + _space;
                        if (_minWidth > autoWidth)
                        {
                            autoWidth = _minWidth;
                        }
    
                        autoHeight = maxHeight + _offsetMargin;
                        if (_minHeight > autoHeight)
                        {
                            autoHeight = _minHeight;
                        }
                    }
    
                    CGFloat offsetY = -((autoHeight - maxHeight) / 2.0 - _offsetMargin);
    
                    [self setTitleEdgeInsets:UIEdgeInsetsMake(-offsetY , _space / 2.0, offsetY,  -_space / 2.0)];
    
                    [self setImageEdgeInsets:UIEdgeInsetsMake(-offsetY,  -_space / 2.0, offsetY, _space / 2.0)];
                }
                    break;
            }
        }
            break;
    

    具体的なコードについては、以下を参照してください.https://github.com/MayerFeng/SimpleNavDemo