1

編集: 以下の詳細な質問の簡略版: サブクラス化された drawRect を介して UIView の境界を更新しても、ビューの内容が引き伸ばされませんか?


私はニュース リーダー アプリケーションを構築しており、UIView を列に分割してコンテンツをページングする方法を検討しています。列の基本的なコーディングは完了していると思います (XML ノードのコンテンツを段落ごとに配列に分割し、段落を切り取らないように必要な合計領域を検出して解析します)。

私が抱えている問題は、内部のコンテンツが拡大されていないビューをサポートするのに十分な大きさであっても、テキストを拡大せずに ContentBounds を更新できないことです。

基本的にこれ:

contentBounds = CGSizeMake(self.bounds.size.width, self.bounds.size.height+COLUMN_YPOS);

[renderer updateContentBounds:contentBounds];

これを引き起こしている:(画像の下の完全なコード) 引き伸ばされた画像

- (void)drawRect:(CGRect)rect
{

NSString *string = contentString;
[string stringByReplacingOccurrencesOfString:@"<br>" withString:@"\n\n"];

// column width
int COLUMN_WIDTH = self.bounds.size.width/2-40;
int COLUMN_HEIGHT = self.bounds.size.height-100;

int COLUMN_XPOS = 20;
int COLUMN_YPOS = 0;

int PAGE_HEIGHT = COLUMN_HEIGHT + 40;

CGSize maximumSize = CGSizeMake(COLUMN_WIDTH, COLUMN_HEIGHT-20);

NSArray *paragraphs = [string componentsSeparatedByString:@"\n"];

NSString *textBuffer = @"";
NSString *preBuffer = @"";
NSString *currentStringSegment;

for (int i=0; i<[paragraphs count]; i++) {

    currentStringSegment = [paragraphs objectAtIndex:i];

    preBuffer = textBuffer;
    textBuffer = [textBuffer stringByAppendingString:@"\n\n"];
    textBuffer = [textBuffer stringByAppendingString:currentStringSegment];

    CGSize expectedSize = [textBuffer sizeWithFont:[UIFont fontWithName:@"Times New Roman" size:16] constrainedToSize:CGSizeMake(COLUMN_WIDTH, COLUMN_HEIGHT) lineBreakMode:NSLineBreakByWordWrapping];

    if(expectedSize.height > maximumSize.height){

        [preBuffer drawInRect:CGRectMake(COLUMN_XPOS, COLUMN_YPOS, COLUMN_WIDTH, COLUMN_HEIGHT) withFont:[UIFont fontWithName:@"Times New Roman" size:16] lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft];
        i--;
        textBuffer = @"";
        preBuffer = @"";

        if(COLUMN_XPOS > 20) {

            COLUMN_XPOS = 20;
            COLUMN_YPOS += PAGE_HEIGHT;

        } else {

            COLUMN_XPOS = COLUMN_WIDTH + 60;

        }

    }

}

if(![preBuffer isEqualToString:@""] && preBuffer != nil){

    [preBuffer drawInRect:CGRectMake(COLUMN_XPOS, COLUMN_YPOS, COLUMN_WIDTH, COLUMN_HEIGHT) withFont:[UIFont fontWithName:@"Times New Roman" size:16] lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentLeft];

}

contentBounds = CGSizeMake(self.bounds.size.width, self.bounds.size.height);

[renderer updateContentBounds:contentBounds];

}
4

2 に答える 2

3

境界が変更されたときの の動作はUIView、プロパティによって決まりcontentModeます。

ドキュメントを見ると、次のようになります。

プロパティの値はcontentMode、新しい境界に合わせてビットマップをスケーリングするか、単にビューの 1 つのコーナーまたはエッジに固定するかを決定します。

デフォルトcontentModeではUIViewContentModeScaleToFill、同じドキュメントページで読むことができるように、

ビューのコンテンツが新しいフレーム サイズに合わせてスケーリングされます。

ビューの を、ビューの境界の上部に配置されたコンテンツを中央に配置するcontentModeなど、歪みのない動作に変更することができます。UIViewContentModeTop

contentMode ここで可能なすべての値を見つけることができます。

于 2013-04-01T21:55:33.170 に答える
0

ページング モードで UIScrollView を使用できます。

ページング モードを使用したスクロール

UIScrollView 内に UIWebView を配置し、HTML/CSS を使用して列を作成し、Web ビューでのユーザー操作をオフにし、UIScrollView を使用して列を水平方向にスクロールできます。

于 2013-04-04T13:47:27.540 に答える