0

私はスタック全体でこれに対する答えを探してきましたが、このトピックには多くのことがあり、少なくとも私には答えられないようです。

ストーリーボード (プロトタイプ セル) に固定サイズのカスタム UIView があります。そのための UIView をサブクラス化し、drawRect メソッドを上書きしました。基本的には、フォーマットされた文字列をまとめて、次のように描画します。

// now for the actual drawing
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetShadowWithColor(context, 
                            CGSizeMake(0, 1), 
                            0,  
                            [UIColor whiteColor].CGColor);

CGMutablePathRef path = CGPathCreateMutable(); //1
CGPathAddRect(path, NULL, self.bounds );

// flip the coordinate system
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CTFramesetterRef framesetter =
CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)stringToDraw); //3

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);


CTFrameDraw(frame, context); //4

デフォルトのサイズを十分に大きくすれば、複数行のテキストを処理できます。

CGPath はすべての UIView を使用しますが、これは問題ありません。

CGPath の幅を固定したままにしたいのですが、本質的に無制限の量のテキストに対応するために高さを拡張したいのですが、現在は切り取られています (パス/ビューがそれを囲むのに十分な大きさではないため)。

CTFramesetterSuggestFrameSizeWithConstraints で遊んでみましたが、役に立ちませんでした。誰かが私が必要とすることを達成するコードを開発するのを手伝ってくれませんか?

4

2 に答える 2

0

描画する文字列と使用するフォントを知っていれば、いつでも境界を取得できます

CGSize boundingSize = CGSizeMake(self.bounds.size.width, CGFLOAT_MAX);
CGSize requiredSize = [yourText sizeWithFont:yourFont
                           constrainedToSize:boundingSize
                               lineBreakMode:UILineBreakModeWordWrap];
CGFloat requiredHeight = requiredSize.height;

そこで高さを取得し、他の場所で再利用できます...

于 2012-05-12T11:57:46.883 に答える
0

これがあなたがやろうとしていることです。これは CoreText API を使用し、間違っている sizeWithFont の回答とは異なり、適切な高さを返すことに注意してください。

// Measure the height required to display the attr string given a known width.
// This logic returns a height without an upper bound. Not thread safe!

- (NSUInteger) measureHeightForWidth:(NSUInteger)width
{
  NSAssert(self.isDoneAppendingText == TRUE, @"isDoneAppendingText");

  NSAssert(self.attrString, @"attrString");

  CFMutableAttributedStringRef attrString = self.attrString;
  CFRange stringRange = self.stringRange;

  CGFloat measuredHeight = 1.0f;

  // Create the framesetter with the attributed string.

  CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);

  if (framesetter) {
    CFRange fitRange;
    CGSize constraints = CGSizeMake(width, CGFLOAT_MAX); // width, height : CGFLOAT_MAX indicates unconstrained

    CGSize fontMeasureFrameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, stringRange, (CFDictionaryRef)NULL, constraints, &fitRange);

    // Note that fitRange is ignored here, we only care about the measured height

    measuredHeight = fontMeasureFrameSize.height;

    CFRelease(framesetter);
  }

  return (NSUInteger) ceil(measuredHeight);
}
于 2013-06-29T19:40:15.350 に答える