4

私が持っていてThe Dark Knight Rises at 7:45pm、それを固定幅の UILabel (iPhone 用) に合わせる必要があるとします。「The Dark Knight Rises at 7:4...」ではなく、「The Dark Knight Ris... at 7:45pm」と切り捨てるにはどうすればよいですか?

4

3 に答える 3

11

UILabel には次のプロパティがあります。

@property(nonatomic) NSLineBreakMode lineBreakMode;

この動作を有効にするには、NSLineBreakByTruncatingMiddle に設定します。

編集

文字列の一部だけを切り詰めたいと思っていたことがわかりません。次に、これを読んでください。

テキストの一部のみに改行モードを適用する場合は、目的のスタイル情報を含む新しい属性文字列を作成し、それをラベルに関連付けます。スタイル付きテキストを使用していない場合、このプロパティは text プロパティのテキスト文字列全体に適用されます。

そのため、段落スタイルを設定するためのクラスもあります: NSParagraphStyle で、変更可能なバージョンもあります。
その属性を適用したい範囲があるとしましょう:

NSRange range=NSMakeRange(i,j);

NSMutableParagraphStyle オブジェクトを作成し、その lineBreakMode を NSLineBreakByTruncatingMiddle に設定する必要があります。他の多くのパラメーターも設定できることに注意してください。

NSMutableParagraphStyle* style= [NSMutableParagraphStyle new];
style.lineBreakMode= NSLineBreakByTruncatingMiddle;

次に、その範囲内のラベルの attributedText にその属性を追加します。 attributedText プロパティは NSAttributedString であり、NSMutableAttributedString ではないため、NSMutableAttributedString を作成してそのプロパティに割り当てる必要があります。

NSMutableAttributedString* str=[[NSMutableAttributedString alloc]initWithString: self.label.text];
[str addAttribute: NSParagraphStyleAttributeName value: style range: range];
self.label.attributedText= str;

NSAttributedString には他にも多くのプロパティがあることに注意してください。ここを確認してください。

于 2012-12-16T23:20:21.240 に答える
3

私の最初のアイデアは、固定幅の 2 つのラベルを並べて表示することですが、何らかの理由でそれを除外したと仮定します。または、このように切り捨てを手動で計算します...

- (NSString *)truncatedStringFrom:(NSString *)string toFit:(UILabel *)label
                          atPixel:(CGFloat)pixel atPhrase:(NSString *)substring {

    // truncate the part of string before substring until it fits pixel
    // width in label

    NSArray *components = [string componentsSeparatedByString:substring];
    NSString *firstComponent = [components objectAtIndex:0];
    CGSize size = [firstComponent sizeWithFont:label.font];

    NSString *truncatedFirstComponent = firstComponent;

    while (size.width > pixel) {
        firstComponent = [firstComponent substringToIndex:[firstComponent length] - 1];
        truncatedFirstComponent = [firstComponent stringByAppendingString:@"..."];
        size = [truncatedFirstComponent sizeWithFont:label.font];
    }

    NSArray *newComponents = [NSArray arrayWithObjects:truncatedFirstComponent, [components lastObject], nil];
    return [newComponents componentsJoinedByString:substring];
}

次のように呼び出します。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 160, 21)];
NSString *string = @"The Dark Knight Rises at 7:45pm";
NSString *substring = @"at";
CGFloat pix = 120.0;
NSString *result = [self truncatedStringFrom:string toFit:label atPixel:120.0 atPhrase:@"at"];

label.text = result;

@"The Dark Kni...at 7:45pm" が生成されます。

于 2012-12-17T01:07:32.830 に答える
3

を設定する必要がありlineBreakModeます。Interface Builderから、または次のようにプログラムで行うことができます

label.lineBreakMode = NSLineBreakByTruncatingMiddle;

UILineBreakModeiOS 5 以降、このようなプロパティのタイプが からに変更されたことに注意してくださいNSLineBreakMode

于 2012-12-16T23:19:25.250 に答える