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边界改变时a 的行为由contentMode属性决定。

如果您查看文档,您将阅读:

属性中的值contentMode决定了位图是否应该缩放以适应新的边界,或者只是固定到视图的一个角或边缘。

默认contentMode设置为UIViewContentModeScaleToFillwhich,您可以在同一个文档页面中阅读,

导致视图的内容被缩放以适应新的帧大小。

您可能希望将contentMode视图的 更改为非扭曲行为,例如UIViewContentModeTop,这将使在视图边界顶部对齐的内容居中。

contentMode 您可以在此处找到所有可能的值。

于 2013-04-01T21:55:33.170 回答
0

您可以在分页模式下使用 UIScrollView。

使用分页模式滚动

您可以在 UIScrollView 中放置一个 UIWebView 并使用 HTML/CSS 创建列,关闭 Web 视图上的用户交互,并使用 UIScrollView 水平滚动列。

于 2013-04-04T13:47:27.540 回答