0

文字列の幅をピクセル単位で調べようとすると

CGSize sz = [@"Test text to hilight without new line for testing" sizeWithFont:CGTextLabel.font];

NSLog(NSStringFromCGSize(sz));

出力は: CoregraphicsDrawing[3306:f803] {339, 21}

文字列をスペース@" "で区切り、ループして各単語の幅 + 各単語の後にスペースの幅を追加すると、合計幅が異なります
CoregraphicsDrawing[3306:f803] 351.000000

単語ごとに幅を計算しているこのコードを確認してください:

str = @"Test text to hilight without new line for testing";


    self.words = [NSMutableArray arrayWithArray:[str componentsSeparatedByString:@" "]];

    CGFloat pos = 0;
    [self.rects addObject:[NSValue valueWithCGPoint:CGPointMake(0, 0)]];
    for(int i = 0; i < [self.words count]; i++)
    {
        NSString *w = [self.words objectAtIndex:i];
        NSLog(w);
        CGSize sz = [w sizeWithFont:CGTextLabel.font];
        pos += sz.width;
        pos += [@" " sizeWithFont:CGTextLabel.font].width;

        if(i != [self.words count]-1)
        {

            [self.rects addObject:[NSValue valueWithCGPoint:CGPointMake(pos, 0)]];
        }
        else {
            NSLog(@"%f",pos); //here actual calculated width is printed. 
        }

    }

誰かが解決策を提案できれば、本当に感謝しています。

4

1 に答える 1

3

いくつかのテストを行った後、スペースだけで呼び出しているように見えsizeWithFont:、余分なスペースが追加され、文字間のスペースと同じように扱われません。使ってみたらこうなったsystemFont

したがって、使用する[@" " sizeWithFont:CGTextLabel.font].width;たびに、文字間のスペースのサイズを取得することはできませんが、ほとんどの場合、端にもいくつかの余分なビットがあります. 以下を使用してこれに気付きました:

CGSize size1 = [@"Hello There" sizeWithFont:[UIFont systemFontOfSize:12]];
CGSize size2 = [@" " sizeWithFont:[UIFont systemFontOfSize:12]];
CGSize size3 = [@"Hello" sizeWithFont:[UIFont systemFontOfSize:12]];
CGSize size4 = [@"There" sizeWithFont:[UIFont systemFontOfSize:12]];

CGSize size5 = [@"Hello There Hello There" sizeWithFont:[UIFont systemFontOfSize:12]];

NSLog(NSStringFromCGSize(size1));
NSLog(NSStringFromCGSize(size2));
NSLog(NSStringFromCGSize(size3));
NSLog(NSStringFromCGSize(size4));
NSLog(NSStringFromCGSize(size5));

コンソールからこれが返されました:

2012-07-17 10:57:40.513 TesterProject[62378:f803] {63, 15}
2012-07-17 10:57:40.514 TesterProject[62378:f803] {4, 15}
2012-07-17 10:57:40.514 TesterProject[62378:f803] {28, 15}
2012-07-17 10:57:40.514 TesterProject[62378:f803] {32, 15}
2012-07-17 10:57:40.514 TesterProject[62378:f803] {128, 15}

したがって、スペースだけで 4 "ピクセル" の幅が返されます。"Hello" は 28 を返し、"There" は 32 を返します。これらを合わせると 64 になると思いますが、63 になりました。したがって、スペースは 4 ではなく 3 を占めています。同様に、"Hello There Hello There" を実行したとき" スペース = 130 に対して 63*2 + 4 が得られると思うでしょう。代わりに 63*2 + 2 が得られました。したがって、この場合のスペースは、ほとんどの場合、実際には 2 ~ 3 "ピクセル" しか占有していませんが、 I get 4 sizeWithFont:だけを呼び出します。@" "

フォントは、すべてのスペースに対して常に正確に同じ量のギャップを作成するとは限りません。おそらく、それが問題を抱えている理由です. 私のテストでは、単語のさまざまな組み合わせに 2 つ、3 つ、または 4 つの「ピクセル」を追加してスペースを確保しました。この呼び出しは、フレーズ全体がある場合にのみ使用する必要があると思います。すべてをまとめて追加するのは難しすぎます。探している機能を作成する別の方法はありますか?

編集: また、2 つの単語を組み合わせて使用​​すると、個別に使用する場合とは異なる結果が得られることもわかりました。

CGSize size = [@"HelloThere" sizeWithFont:[UIFont systemFontOfSize:12]];

「Hello」が 28 を返し、「There」が 32 を返したときに、59 を返しました。

于 2012-07-17T16:20:23.247 に答える