设为首页 加入收藏

TOP

【IOS】将字体大小不同的文字底部对齐(一)
2017-10-13 10:33:14 】 浏览:7933
Tags:IOS 字体 大小 不同 文字 底部

从WP转IOS了,还是放不下......

 

在项目中,要实现如图多个不同大小的文字   底部对齐的效果   像下面这样:

(想要的效果)

以为用三个UIFont不同的UILabel  之后让他们底部对齐就可以了,但是效果是下面这样的:

 (不想要的效果)

底部完全不对齐呀,为什么"1314"比两边高出了那么多呀!!!!强迫症不能忍呀!!!

--------------------------------------------------------------------------------

对比:

1.在Windows Phone中 控件是相对布局

Windows Phone里面TextBlock需要设置一个固定的 宽度  和 高度 (至少我是这样做的)

TextBlock不但可以将文字设置为水平居中、偏左、偏右,还能通过属性 

text.VerticalContentAlignment=Top/Center/Bottom将文字置于顶部/居中/底部。(WP中发现也只能水平方向的)

2.在IOS中 控件是绝对布局: 对于一个控件  需要设置它的frame(包括起始位置、高和宽)

可以通过以下方法直接获取一个字符串的自适应的高度和宽度:(这点觉得比WindowsPhone好)

CGSize labelSize = [@"1314" sizeWithAttributes:@{NSFontAttributeName:kLabelFont}];

而原生的UIlabel只能设置textAlignment文字的水平偏移属性,而无法直接更改竖直方向的偏移。

 

WindowsPhone中要实现上面的效果,只需将三个TextBlock置底,TextBlock内容居下,即可对齐。

(这一点我突然的不确定了,好像很多时候我都是直接设置margin来手动对齐的,有空回WindowsPhone看看再修改。)

[2016.5.25修改] WP中TextBlock也没有VerticalContentAlignment属性...

 

弯路:

所以在IOS处理这个问题的时候,我想着既然三个控件的底部都是对齐了的,只是高度不一样,能否仿照着WindowsPhone那样,

将较高UILabel的内容("1314")竖直偏移到最底下呢?

经过查阅  UILabel找到了这些:  

不能直接调用  只能通过继承来重写

// override points. can adjust rect before calling super. (在调用父类前  可以调整文本内容的位置TextRect)

// label has default content mode of UIViewContentModeRedraw

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;  //重写来重绘文字区域

- (void)drawTextInRect:(CGRect)rect;  //重写来重绘文本  重写时调用super可以按默认图形属性绘制

所以为了改变text的位置, 我们只需要改变textRectForBounds的返回值rect,并且根据这个rect重绘文本就可以了

1、关于contentMode,该模式为视图提供了多种模式用以适用框架矩形。如果对除UIVewContentModeRedraw之外的模式(如UIViewContentModeScaleToFill)都不满足需求,或者说有特定需要自定义绘制视图,可以设置为此值。那么将在视图适应框架矩形变化时缺省自动调用setNeedsDispllay或setNeedsDisplayInRect:,从而重绘视图。
2、而向视图发送setNeedsDisplay(或setNeedsDisplayInRect:)消息时,无论此时contentMode为何种模式,都将强制调用drawRect:  

主要代码:(这个代码网上一大把,自己找去) 

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{          //方法里的形参bounds指的是UILabel的bounds 
    CGRect rc = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];  //text的bounds switch (_verticalAlignment) {
        case VerticalAlignmentTop:
            rc.origin.y = bounds.origin.y;  
            break;
        case VerticalAlignmentBottom:
            rc.origin.y = bounds.origin.y + bounds.size.height - rc.size.height;
            break;
        case VerticalAlignmentMiddle:
        default:
            rc.origin.y = bounds.origin.y + (bounds.size.height - rc.size.height) / 2;
            break;
    } 
    return rc;
}
- (void)drawTextInRect:(CGRect)rect
{
    CGRect rc = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:rc];
}

然而发现:对于自适应宽高(CGSize)的Label, 设置了verticalAlignment属性基本上没多大区别

origin.x  origin.y 均为零   并且SIZE区别几乎没有  所有也不会有多大区别。

这里我进行了一个对比:对于字符串@"1314",设置不同的UIFont 观察UILabel和内部的textRect的大小差别

UIFont                                 1                                         50                              

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇OC NSArray 数组 下一篇iOS 网络编程:JSON解析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目