0

ここには非常に簡単な解決策があると確信していますが、それを理解できないようです。セクションヘッダーを持つ水平スクロール UICollectionView があります。セクションヘッダーのテキストを次のように縦書きにしたい:

セクション ヘッダー

コンテキストのローテーションと関係があることは知っていますが、ドキュメントを読んだり、ここで同様の投稿を読んだりしても、これを完全に理解できないようです。これは私がこれまでに持っているものです:

- (void)drawTitle
{
    CGRect titleRect = self.bounds;

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
    paragraphStyle.alignment = NSTextAlignmentCenter;
    UIFont *cellFont = [UIFont fontWithName: DEFAULT_FONT size: self.bounds.size.width * FONT_WIDTH_FACTOR];

    NSAttributedString *cellText = [[NSAttributedString alloc] initWithString: self.title attributes: @{ NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : cellFont, NSForegroundColorAttributeName : [UIColor whiteColor] }];

    [cellText drawInRect: titleRect];

    // Rotation code???
}

私が確信しているのと同じくらい簡単です。ここで何かが明らかに欠けています。事前にどうもありがとうございました。

4

2 に答える 2

2

現在行っている方法でテキストを描画した場合のグラフィックス コンテキストの図を次に示します。

図1

2 つのことを行う必要があります。テキストが垂直に描画されるように座標系を回転させる必要があり、回転したテキストの四角形が (回転していない)self.bounds四角形と正確に重なるように座標系 (またはテキストの四角形) を移動する必要があります。

UIKit 関数を使用して座標系を変換することはできません。Core Graphics (別名 Quartz) のレベルまで下げる必要があります。まず、グラフィック コンテキストへの参照を取得し、その状態を保存します。

CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSaveGState(gc); {

これで座標系を変換できます。最初に、原点を境界矩形の左下隅に「移動」(移動) します。

    CGContextTranslateCTM(gc, 0, titleRect.size.height);

この時点で文字列を描画すると、グラフィックス コンテキストは次のようになります。

図2

それでは、座標系を直角に回転させます。

    CGContextRotateCTM(gc, -M_PI_2);

角度の符号が間違っている可能性があります。-何も表示されない場合は、記号を削除してみてください。

文字列を描画すると、グラフィックス コンテキストは次のようになります。

図 3

に渡す四角形ではdrawInRect:widthは常に x 軸に沿った距離であり、x 軸は垂直であることに注意してください。したがって、テキスト四角形の幅をビューの高さと同じにし、テキスト四角形の高さをビューの幅と同じにする必要があります。したがって:

    [cellText drawInRect:CGRectMake(0, 0, titleRect.size.height, titleRect.size.width)];

すべて完了したので、グラフィックス コンテキストの状態を復元します。

} CGContextRestoreGState(gc);

すべて一緒に:

CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSaveGState(gc); {
    CGContextTranslateCTM(gc, 0, titleRect.size.height);
    CGContextRotateCTM(gc, -M_PI_2);
    [cellText drawInRect:CGRectMake(0, 0, titleRect.size.height, titleRect.size.width)];
} CGContextRestoreGState(gc);
于 2013-07-14T05:29:19.253 に答える