如何从底部制作一个 UILabel "fill up"?

How to make a UILabel "fill up" from the bottom?

我正在尝试从底部制作一个 UILabel "fill up"。我的意思是(如果有换行符)我想在标签的第二行有尽可能长的数量,而不是在第一行。这是我的情节提要中的默认行为:

这是我希望发生的事情:

这可能吗?如果是这样,我将如何去做这件事。我正在使用 swift 并安装了 cocoa pods,所以如果您对允许我执行此操作的框架有建议,我很乐意这样做,尽管我还没有无法通过搜索找到任何内容。提前致谢!

听起来您可能必须自己编写行拆分功能。 向后遍历字符串,直到找到 space,用现有单词 + 这个新单词创建一个临时字符串,根据 window 宽度测量字符串,如果它太大,换行在那里重新开始一个新行。

如果您仍在努力完成任务,这里是我的代码。希望对您有所帮助:)

只需将以下 class 添加到您的项目中。

CustomLabel.h

#import <UIKit/UIKit.h>
@interface CustomLabel : UILabel
@end

CustomLabel.m

#import "CustomLabel.h"

@implementation CustomLabel


- (instancetype)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];

    if (self) {

        self.numberOfLines = 0;
    }

    return self;
}

-(NSString *) getManipulatedString: (NSString *)text {

    NSString *reverseString = [self getReverseString:text];

    NSArray *arrayOfReverseString = [reverseString componentsSeparatedByString:@" "];

    NSString *finalReverseString = @"";

    for (NSString *word in arrayOfReverseString) {

        NSString *tempString = finalReverseString;

        tempString = [tempString stringByAppendingString:[NSString stringWithFormat:@"%@ ", word]];

        CGRect screenRect = [[UIScreen mainScreen] bounds];
        CGFloat screenWidth = screenRect.size.width;

        CGRect labelRect = [tempString boundingRectWithSize:CGSizeMake(screenWidth, 10000)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                          attributes:@{
                                                       NSFontAttributeName : self.font
                                                       }
                                          context:nil];

        if (labelRect.size.width > self.frame.size.width) {

            finalReverseString = [finalReverseString stringByAppendingString:[NSString stringWithFormat:@"\n%@ ", word]];
        } else {

            finalReverseString = tempString;
        }

    }

    NSArray *arrayOflines = [self getReverseOfArray:[finalReverseString componentsSeparatedByString:@" \n"]];

    NSString *finalString = @"";

    for (NSString *lineString in arrayOflines) {

        NSString *reverse = [self getReverseString:lineString];

        finalString = [finalString stringByAppendingString:[NSString stringWithFormat:@"%@\n",reverse]];
    }

    NSLog(@"%@", finalString);

    return [[finalString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

}


- (NSString *)getReverseString:(NSString *)string {

    NSArray *arrayOfWords = [string componentsSeparatedByString:@" "];

    NSString *reverseString = [[self getReverseOfArray:arrayOfWords] componentsJoinedByString:@" "];

    return reverseString;
}

- (NSArray *)getReverseOfArray: (NSArray *)array {

    NSMutableArray *reversed = [NSMutableArray arrayWithCapacity:[array count]];
    NSEnumerator *enumerator = [array reverseObjectEnumerator];
    for (id element in enumerator) {
        [reversed addObject:element];
    }

    return reversed;
}

- (void)setText:(NSString *)text {

    NSString *string = [self getManipulatedString:text];

    [super setText:string];

    [self sizeToFit];
}

@end

要使用它,您只需添加以下几行即可:)

CustomLabel *label = [[CustomLabel alloc] initWithFrame:CGRectMake(10, 100, 210, 100)];

label.text = @"This is a test for aa next aa aa alignment from bottom tadadada tatadad";

你得到上面代码的以下输出: