1

ラベルのフレームを再計算するには、次の方法を使用します。

- (void)fitElements {    
    CGFloat currentX = 0.0;
    CGFloat currentY = 0.0;    
    for (UIView *view in elements) {    
        CGRect rect = view.frame;
        rect.origin.x = currentX;
        rect.origin.y = currentY;        
        currentX = rect.origin.x + rect.size.width + 5;        
        view.frame = rect;      
        if (currentX >= 420) {
            currentX = 0.0;
            currentY += rect.size.height + 5;
        }
    }
}

ラベルが420を超える境界を越える場合は、オブジェクトを次の行に移動します。

- (void)createElements {
    NSInteger tag = 0;
    for (NSString *str in words) {
        UILabel *label = [[UILabel alloc] init];
        [self addGesture:label];
        [label setTextColor:[UIColor blueColor]];
        label.text = str;
        [label setAlpha:0.8];
        [label sizeToFit];
        [elements addObject:label];
    }
}

上記のように(を使用して[label sizeToFit];)オブジェクトを作成すると、次のようになります。

ここに画像の説明を入力してください

私のレーベルがすべて国境を越えたことがわかるように

しかし、ハードコードフレームでラベルを使用すると、次のようになります。

ここに画像の説明を入力してください

これが私が欲しいものですが、この場合、私はオブジェクトの静的な幅を持っています。

これは、ハードコードフレームを使用した私の方法です。

- (void)createElements {
    NSInteger tag = 0;
    for (NSString *str in words) {
        UILabel *label = [[UILabel alloc] init];
        [self addGesture:label];
        [label setTextColor:[UIColor blueColor]];
        label.text = str;
        [label setAlpha:0.8];
        [label setFrame:CGRectMake(0, 0, 100, 20)];
        [elements addObject:label];
        tag++;
    }
}

相対的な幅のオブジェクトを作成するにはどうすればよいですか?また、正しく再計算することもできますか?

4

1 に答える 1

2

コードを少し変更するだけで、左揃えのようなものを実現できます。

- (void)fitElements {
CGFloat currentX = 0.0;
CGFloat currentY = 0.0;
for (UILabel *view in elements) { //UIView changed to UILabel
    CGRect rect = view.frame;
    rect.origin.x = currentX;
    rect.origin.y = currentY;
    rect.size.width = [self widthOfString: view.text withFont:view.font];
    currentX = rect.origin.x + rect.size.width + 5;
    view.frame = rect;
    if (currentX + rect.size.width >= 420) {   //EDIT done here
        currentX = 0.0;
        currentY += rect.size.height + 5;
        rect.origin.x = currentX;
        rect.origin.y = currentY;
        view.frame = rect;
        currentX = rect.origin.x + rect.size.width + 5;
    }
}}

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }

widthOfStringメソッドはスティーブンの答えからコピーされます

編集:

NSString UIKit Additionsには、文字列のグラフィック表現のサイズを処理する多くの便利なメソッドもあります。

于 2012-10-31T15:07:41.827 に答える