在CoreText中将半行左对齐,右对齐

时间:2013-12-18 09:48:33

标签: ios iphone objective-c ipad core-text

我正在创建销售点(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

所以我需要一个字符串悬浮在左边,另一个字符串漂浮在右边......

4 个答案:

答案 0 :(得分:1)

我唯一能想到的是插入每个字符串f.e.在第一个字符串后面30个空格并指定wordWrap = truncate middle。不太确定这正是你正在寻找的。

我同意Brian Shamblen对2个标签很容易。

答案 1 :(得分:1)

看起来你想要的并不是第二列,Core Text不能开箱即用,而是表格布局(就像好的'<table>)。幸运的是,使用制表位可以在Core Text中实现表格布局。你需要的唯一两件事是:

  • CHARACTER TABULATIONU+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”。

  • 通过将左侧单词与空格连接而创建一个字符串 正确对象,真爱。

  • 定义您想要标签的框架的widthheight 要包含在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的边框。

以下是我的工作代码的屏幕截图:

enter image description here

它也适用于“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