0

チャットアプリを作っています。メッセージが到着すると、誰がそれを送信したかを示す必要があります。たとえば、私が送信者だった場合、次のように表示されます。

たけし:メッセージ

アンドレス: メッセージ

"Takeshi" と "Andres" を別の色にしますが、メッセージと同じ行に、次のように行を折り返します。

Takeshi: some message text, text, text , text
         text, text, text end.

私は次のことを試みています:

  • メッセージのサイズを計算します。
  • 送信者の名前のサイズを計算します。
  • 差出人の名前の長さで「 」の文字列を作成します。

しかし、「ない」では十分ではありません。

私はこれを作ります:

NSString *from;

if(usr){
    from = [NSString stringWithFormat:@"%@: ", @"Yo"];
}else{
    from = [NSString stringWithFormat:@"%@:  ", [_lbSupportName text]];
}
//This give me one string of n characters of  ' ' character.


NSString *spaces = [ChatView stringWithRepeatCharacter:' ' times:from.length * 2];

NSString *mensaje = [NSString stringWithFormat:@"%@ %@", spaces, msg];



//Calculating the height
CGSize messageSize = [mensaje sizeWithFont:[UIFont fontWithName:DEFAULT_TEXTFONT size:20]
                           constrainedToSize:CGSizeMake(_scvConversation.frame.size.width - 10, FLT_MAX)
                               lineBreakMode:UILineBreakModeWordWrap];

CGSize fromSize = [from sizeWithFont:[UIFont fontWithName:DEFAULT_TEXTFONT size:22]
                   constrainedToSize:CGSizeMake(FLT_MAX, FLT_MAX)
                       lineBreakMode:UILineBreakModeWordWrap];


//Image Background
UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(5, yConversationPosition + 5, _scvConversation.frame.size.width - 10, messageSize.height + 30)];

yConversationPosition += image.frame.size.height + 5;



//Create the Label From
UILabel *lb_From = [[UILabel alloc] initWithFrame:CGRectMake(0, 9, fromSize.width, 30)];
[lb_From setFont:[UIFont fontWithName:DEFAULT_TEXTFONT size:20]];
[lb_From setBackgroundColor:[UIColor clearColor]];
[lb_From setText:from];



//Create the Label Message
UILabel *lb_WriteMessage = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, image.frame.size.width-10, image.frame.size.height - 10)];
[lb_WriteMessage setNumberOfLines:messageSize.height / DEFAULT_TEXTSIZE];
[lb_WriteMessage setFont:[UIFont fontWithName:DEFAULT_TEXTFONT size:20]];
[lb_WriteMessage setText:mensaje];
[lb_WriteMessage setBackgroundColor:[UIColor clearColor]];
[lb_WriteMessage setTextColor:[UIColor colorWithRed:(92/255.0f) green:(98/255.0f) blue:(101/255.0f) alpha:1]];



if(usr){
    [image setImage:[UIImage imageNamed:@"chat-mensajes-yo.png"]];
    [lb_From setTextColor:[UIColor colorWithRed:(230/255.0f) green:(85/255.0f) blue:(84/255.0f) alpha:1]];
}else{
    [image setImage:[UIImage imageNamed:@"chat-mensajes-asesor.png"]];
    [lb_From setTextColor:[UIColor colorWithRed:(28/255.0f) green:(168/255.0f) blue:(175/255.0f) alpha:1]];
}


[lb_WriteMessage addSubview:lb_From];
[image addSubview:lb_WriteMessage];
[_scvConversation addSubview:image];

//Set the contentSize of the scv_Message and scroll to the new Message
[_scvConversation setContentSize:CGSizeMake(0, yConversationPosition)];


if(_scvConversation.contentSize.height > _scvConversation.frame.size.height){
    //Scroll to last Message
    float diference = yConversationPosition - _scvConversation.frame.size.height +5;
    [_scvConversation setContentOffset:CGPointMake(0, diference)];
}

[image release];
[lb_WriteMessage release];

助けてください、私にはそれができませんでした。:/

4

2 に答える 2

0

Core Text API を見てください。これは単純なツールではありませんが、その仕組みを理解すれば、信じられないほどの柔軟性が得られます。これが良い出発点です: http://www.cocoanetics.com/2011/01/befriending-core-text/

おそらく後で、メッセージで名前を強調表示したり、その他のリッチな機能など、チャットでより複雑なロジックを使用したくなるでしょう。テキストの整形。これらすべてをコアテキストで行うことができます。

于 2012-05-12T00:24:33.537 に答える
0

2 つのラベルを使用する必要があります。必要な色 (1 行のラベル) で "Name:" の最初のラベルを作成し、テキストに基づいてその幅を計算してから、新しいラベルを作成し、その高さと行数を計算して、以下を使用して配置します。

[lb_WriteMessage setFrame:CGRectMake(lb_From.frame.origin.x + lb_From.frame.size.width + spacer, lb_from.origin.y, messageSize.width, messageSize.height)];

(ここで、スペーサーは、ラベル間に必要なピクセル スペースの数です)。

于 2012-05-11T22:12:24.650 に答える