我正在创建销售点(POS)收据,并且需要具有特定宽度的商品名称,并且需要在右侧设置价格(例如float-right
中的CSS
)。
我正在使用https://github.com/FuerteInternational/FTCoreText来创建内容。任何想法如何实现这一点,而无需创建两个视图并将它们放在彼此之上?
为了澄清,我需要这个:
Coffee £1.45
milk, skinny
Danish Pastry £1.75
Coca Cola £1.10
Full English Bfst £12.50
所以我需要一个字符串悬浮在左边,另一个字符串漂浮在右边......
答案 0 :(得分:1)
我唯一能想到的是插入每个字符串f.e.在第一个字符串后面30个空格并指定wordWrap = truncate middle。不太确定这正是你正在寻找的。 p>
我同意Brian Shamblen对2个标签很容易。
答案 1 :(得分:1)
看起来你想要的并不是第二列,Core Text不能开箱即用,而是表格布局(就像好的'<table>
)。幸运的是,使用制表位可以在Core Text中实现表格布局。你需要的唯一两件事是:
CHARACTER TABULATION
(U+0009
)字符,可以这样做:
NSString *string = @"Coffee\t£1.45\n milk, skinny\nDanish Pastry\t£1.75\nCoca Cola\t£1.10\nFull English Bfst\t£12.50";
CGFloat width = 200;
NSArray *tabs = @[CFBridgingRelease(CTTextTabCreate(kCTTextAlignmentRight, width, NULL))];
CTParagraphStyleSetting setting = {kCTParagraphStyleSpecifierTabStops, sizeof(tabs), &tabs};
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(&setting, 1);
NSDictionary *attributes = @{CFBridgingRelease(kCTParagraphStyleAttributeName): CFBridgingRelease(paragraphStyle)};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes];
有两点需要注意:
答案 2 :(得分:0)
也许你可以在每行只有一个UILabel
的情况下执行以下操作:
定义左边的单词,如“Coffee”,右边的单词,如“£1.45”。
通过将左侧单词与空格连接而创建一个字符串 正确对象,真爱。
定义您想要标签的框架的width
和height
要包含在CGSizeMake(width, height)
中的字符串。
使用提供的sizeThatFits
估算标签的大小
您想要作为参数的CGSize
约束。
如果标签的估计宽度小于要求的宽度 宽度,通过为您的标签添加空格来增加标签的大小 字符串并重复。
在代码中:
NSArray *leftWords = @[@"Coffee", @" milk, skinny", @"Danish Pastry", @"Coca Cola", @"Full English Bfst"];
NSArray *rightWords = @[@"£1.45", @"", @"£1.75", @"£1.10", @"£12.50"];
CGFloat xOffset = 5;
CGFloat yOffset = 60;
CGFloat labelHeight = 44;
CGFloat labelWidth = 300;
for (int i = 0; i < leftWords.count; i ++) {
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(xOffset, yOffset + i * labelHeight, labelWidth, labelHeight)];
aLabel.numberOfLines = 1;
aLabel.textAlignment = NSTextAlignmentLeft;
aLabel.layer.borderColor = [UIColor greenColor].CGColor;
aLabel.layer.borderWidth = 1.0f;
NSString *leftWord = [leftWords objectAtIndex:i];
NSString *rightWord = [rightWords objectAtIndex:i];
NSMutableString *spaces = [[NSMutableString alloc] initWithString:@" "];
const CGFloat MAX_WIDTH = 310;
CGSize maxLabelSize = CGSizeMake(MAX_WIDTH, CGFLOAT_MAX);
CGSize expectedSize = CGSizeMake(0, 0);
CGFloat expectedWidth = 0.0;
NSString *phrase = @"";
do {
phrase = [NSString stringWithFormat:@"%@%@%@", leftWord, spaces, rightWord];
aLabel.text = phrase;
expectedSize = [aLabel sizeThatFits:maxLabelSize];
expectedWidth = expectedSize.width;
// Increase spaces
[spaces appendString:@" "];
} while (expectedWidth < MAX_WIDTH);
CGRect frame = aLabel.frame;
frame.size = expectedSize;
aLabel.frame = frame;
[self.view addSubview:aLabel];
}
我已将上述内容放在我的viewDidLoad
内并执行#import <QuartzCore/QuartzCore.h>
以允许标记UILabel的边框。
以下是我的工作代码的屏幕截图:
它也适用于“milk,skinny”行,因为标签的文本对齐方式设置为NSTextAlignmentLeft
。
答案 3 :(得分:0)
我最近遇到了这个问题,没有找到答案。.所以我为需要它的任何人创建了一个类!假设您要创建一个字符串列表,例如问题中的示例:
- (void)createReceipt {
NSString *coffee = [LRString LRStringWithLeft:@"Coffee" right:@"£1.45" maxlength:29 maxleft:16 maxright:11];
}
此“咖啡”字符串如下所示:
Coffee £1.45
“ maxlength”是字符串的最大长度
“ maxleft”是您的左弦(咖啡)的最大长度
“ maxright”是您的右字符串的最大长度(价格)
如果名称超过“ maxleft”长度,则名称(咖啡)的最后3个字母将替换为“ ...”
在GitHub上查看:https://github.com/iosdec/LRString