如何从底部制作一个 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";
你得到上面代码的以下输出:
我正在尝试从底部制作一个 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";
你得到上面代码的以下输出: