iOS 利用runtime修改UILabel的默認(rèn)顯示文本方式

首先說明一個(gè)需求,如下圖

默認(rèn)顯示.png

上面的文本偷懶的時(shí)候會(huì)這樣布局,可是會(huì)有需求提出需要文本1頂部對(duì)齊,可是又需要底部緊靠下方文本,一般做法就是設(shè)置一個(gè)小的高度,讓文本顯示即可。
針對(duì)于此,我們可以利用runtime重寫兩個(gè)方法,其實(shí)原則上是不建議在分類中重寫父類的方法,入侵性太大了,我們只需重寫之后保持父類方法仍然可用即可。
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;- (void)drawTextInRect:(CGRect)rect;

利用runtime給分類增加屬性。

typedef enum
{
    
     LXVerticalAlignmentMiddle = 0, // default
    LXVerticalAlignmentTop,
    LXVerticalAlignmentBottom,
} LXVerticalAlignment;
@interface UILabel (LXVerticalStyle)
@property(nonatomic,assign)LXVerticalAlignment verticalStyle;
-(void)setVerticalStyle:(LXVerticalAlignment)verticalStyle{
    
    objc_setAssociatedObject(self, &style, @(verticalStyle), OBJC_ASSOCIATION_ASSIGN);
    [self setNeedsDisplay];
}
-(LXVerticalAlignment)verticalStyle{
   id value =  objc_getAssociatedObject(self, &style);
    return [value intValue];
}

接下來就是交換方法,重寫布局。

交換方法

+(void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        Class class =   objc_getClass("UILabel");
        [class methodSwizzlingWithOriginalSelector:@selector(textRectForBounds:limitedToNumberOfLines:) bySwizzledSelector:@selector(LXTextRectForBounds:limitedToNumberOfLines:) ];
        
          [class methodSwizzlingWithOriginalSelector:@selector(drawTextInRect:) bySwizzledSelector:@selector(LXDrawTextInRect:) ];
        
    });
}

重寫布局

-(CGRect)LXTextRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines{
    CGRect textRect = [self LXTextRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
    switch (self.verticalStyle) {
        case LXVerticalAlignmentTop:
            textRect.origin.y = bounds.origin.y;
            break;
        case LXVerticalAlignmentBottom:
            textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height;
            break;
        case LXVerticalAlignmentMiddle:
            // Fall through.
        default:
            textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0;
    }
    return textRect;
}

-(void)LXDrawTextInRect:(CGRect)requestedRect {
    CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
    [self LXDrawTextInRect:actualRect];
}

使用

頂部對(duì)齊
self.myLabel.verticalStyle = LXVerticalAlignmentTop;

頂部.png

頂部對(duì)齊
self.myLabel.verticalStyle = LXVerticalAlignmentBottom;

底部.png

該分類已被收錄在LXUtils中,可直接pod.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,893評(píng)論 33 466
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,173評(píng)論 25 708
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,074評(píng)論 0 9
  • “我從未見過一個(gè)早起勤奮謹(jǐn)慎誠實(shí)的人抱怨命運(yùn)不好;良好的品格、優(yōu)秀的習(xí)慣,堅(jiān)強(qiáng)的意志,是不會(huì)被假設(shè)所謂的命運(yùn)擊敗的...
    windypeng閱讀 363評(píng)論 0 2
  • 大數(shù)據(jù)平臺(tái)下的數(shù)據(jù)治理圖文百度文庫 https://wenku.baidu.com/view/2620f6e7c...
    葡萄喃喃囈語閱讀 1,488評(píng)論 0 3

友情鏈接更多精彩內(nèi)容