调整UILabel以对齐屏幕右侧

时间:2017-08-07 18:53:42

标签: objective-c uitableview ios8 uilabel

目前我正在尝试在应用程序中创建消息传递功能。

我正在尝试将UILabel与用户发送到屏幕右侧的消息对齐。随着文本宽度内容的增加,我希望它延伸到屏幕的左侧,然后一旦达到最大宽度就换行。

正如您所看到的,我正确地将文本行分解,但我无法正确地将文本放在屏幕上。

我对此问题的解决方案是以编程方式调整UILabel的宽度,但是我无法从自定义传出消息单元的xib文件中的固定大小进行更改

有人可以建议如何做到这一点?

编辑:

我在UILabel的当前界限上绘制了一些框,以显示它目前在做什么 Box drawn over UILabel bounds

这是移动的文本,UILabel绑定重绘以解释我想要做什么。 Box and text moved to show what I'm trying to do.

应用的截图 Screen shot of messaging feature in application

2 个答案:

答案 0 :(得分:0)

在这里,您应该根据文本长度计算标签的宽度。 尝试使用此API根据文本输入获取标签大小。

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@ {NSFontAttributeName:[UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

我不在下面会在你的情况下工作。但你可以尝试一下。

在Xcode中创建标签,使用自动布局设置填充(在尾随和灵活的前导空间上大多数4个点> 4个点)。确保将行数设置为“0”并将文本对齐到右侧。这里不要为宽度设置固定大小

答案 1 :(得分:0)

enter image description here

您可以通过测量文本的长度并调用尺寸以适合标签来实现所需的效果。然后将标签的框架(或周围的superView,如果需要)偏移到屏幕的左侧或右侧。

这是一个快速方法(可能最好在其他地方声明变量maxWidth和padding)。请注意' w'是屏幕宽度的变量。

-(UIView *)bubbleWithText:(NSString *)text atOffset:(float)yOff isLeftAligned:(bool)leftAligned {

    float maxWidth = 200.0f;
    float intraCellPadding = 5.0f;

    UILabel * label = [UILabel new];
    label.frame = CGRectMake(intraCellPadding, intraCellPadding, maxWidth, 0);
    label.textColor = (leftAligned) ? [UIColor blackColor] : [UIColor whiteColor];
    label.text = text;
    label.numberOfLines = 0;
    [label sizeToFit];

    float width = label.frame.size.width;
    float height = label.frame.size.height;
    float xOff = (leftAligned) ? intraCellPadding : w-3*intraCellPadding-width;

    UIView * bubble = [UIView new];
    bubble.frame = CGRectMake(xOff, yOff, width + 2 * intraCellPadding, height + 2 * intraCellPadding);
    bubble.backgroundColor = (leftAligned) ? [UIColor greenColor] : [UIColor blueColor];
    bubble.layer.cornerRadius = intraCellPadding;
    [bubble addSubview:label];

    return bubble;

}

你可以用以下的方式调用上面的内容:

float interCellPadding = 10.0f;
float yOff = 20.0f;
bool previousWasLeft = false;

NSArray * texts = @[@"Bacon ipsum dolor amet kevin swine ham hock, leberkas porchetta salami bacon picanha shoulder pig strip steak sirloin.",
                    @"Short loin hamburger meatloaf jowl, sirloin swine pork belly tail t-bone venison.",
                    @"Flank meatloaf prosciutto ball tip strip steak rump.",
                    @"Short piggy.",
                    @"Tri-tip ribeye drumstick andouille leberkas bacon pork chop meatball pork spare ribs chicken.",
                    @"Strip steak filet mignon tri-tip sausage, cow frankfurter bacon ribeye cupim burgdoggen shank pork belly fatback ham hock."];

for (NSString * text in texts){

    //random assignment left / right
    //by creating a random number, either one or zero
    //this doubles up as a boolean
    bool alignLeft = arc4random_uniform(2);

    //here we increment the offset
    //depending on whether the previous bubble
    //was on the same side or not, giving a
    //bit more space for alternating bubbles.
    yOff += (previousWasLeft != alignLeft) ? interCellPadding : interCellPadding/2.0f;
    previousWasLeft = alignLeft;

    //create the bubble and add
    UIView * bubble = [self bubbleWithText:text atOffset:yOff isLeftAligned:alignLeft];
    [self.view addSubview:bubble]; //or scrollView whatever

    //incrmeent the offset
    yOff += bubble.frame.size.height;

}

这很快,很脏,但展示了如何实现您的需求。对于很多细胞(这可能是你想要的),如果你要去自定义路线,你必须留意从内存中释放它们。调整UICollectionView单元并简单地对齐其中的内容可能更容易。