zoukankan      html  css  js  c++  java
  • 自定义UILabel设置垂直方向的居上,居中,居下

    IOS系统框架中UILabel的属性textAlignment只调整水平方向的居中,居左,居右,而没有垂直方向的调整。所以要自定义一个继承自UILabel的类,在类的实现文件中进行文字的重绘,达到垂直方向的位置调整。

    新建一个类文件,继承自UILabel,头文件如下:

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger,VerticalAlignment){
        VerticalAlignmentTop,
        VerticalAlignmentMiddle,
        VerticalAlignmentBottom
    };
    
    @interface FSVerticallyAlignedLabel : UILabel
    
    @property (nonatomic,assign) VerticalAlignment verticalAlignment;
    
    @end
    

     在.m文件中,实现verticalAlignment的设置方法

    @implementation FSVerticallyAlignedLabel
    
    - (id)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame]) {
            self.verticalAlignment = VerticalAlignmentMiddle;
        }
        
        return self;
    }
    
    /**
     *  设置属性方法
     *
     *  @param verticalAlignment 垂直调整位置
     */
    - (void)setVerticalAlignment:(VerticalAlignment)verticalAlignment
    {
        _verticalAlignment = verticalAlignment;
        
        [self setNeedsDisplay];
    }
    
    /**
     *  计算文字的矩形区域
     *
     *  @param bounds        label矩形区域
     *  @param numberOfLines 行数
     *
     *  @return 返回文字所占的矩形区域
     */
    - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
    {
        CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
        
        //通过设定字体区域的y值来调整垂直位置
        switch (self.verticalAlignment) {
            case VerticalAlignmentTop:
                textRect.origin.y = bounds.origin.y;
                break;
            case VerticalAlignmentMiddle:
                textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0;
                break;
            case VerticalAlignmentBottom:
                textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height;
                break;
        }
        
        return textRect;
    }
    
    //重写父类方法
    - (void)drawTextInRect:(CGRect)rect
    {
        CGRect actualRect = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
        [super drawTextInRect:actualRect];
    }
    
    @end
    
  • 相关阅读:
    Intent.ACTION_TIME_TICK 广播
    Android ContentObserver
    android:duplicateParentState属性解释
    Android CursorAdapter
    android AndroidManifest.xml 多个android.intent.action.MAIN (
    PreferenceActivity详解
    WORD和WPS中英文混合的内容间距离很大怎么办?
    Android 屏幕适配
    OC第四课
    PL/SQL联系oracle成功可以sql解决的办法是检查表的名称无法显示
  • 原文地址:https://www.cnblogs.com/csdnmc/p/5407079.html
Copyright © 2011-2022 走看看