正确使用DrawRect覆盖 - 我可以阻止视图拉伸吗?

时间:2013-04-01 20:30:11

标签: ios objective-c ipad cocoa-touch

编辑:下面详细问题的简化版本:您是否可以通过子类化的drawRect更新UIView的边界,而不会导致视图内容延伸?


我正在构建一个新闻阅读器应用程序,并一直在研究如何将我的UIView分成列并仍然可以分页内容。我相信我有列的基本编码(将XML节点内容按段分割成一个数组,然后通过检测所需的总面积进行解析,以便不切断段落。)

我遇到的问题是我无法在没有文本拉伸的情况下更新ContentBounds,即使内部的内容足够大以支持未拉伸的视图。

基本上这个:

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

[renderer updateContentBounds:contentBounds];

造成这种情况:(图片下方的完整代码) Stretched Image

- (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];

}

2 个答案:

答案 0 :(得分:3)

UIView属性确定边界发生变化时contentMode的行为。

如果您看一下documentation,您会看到:

  

contentMode属性中的值确定是应缩放位图以适应新边界还是仅固定到视图的一个角或边缘。

默认情况下,contentMode设置为UIViewContentModeScaleToFill,正如您可以在同一个文档页面中阅读的那样,

  

使视图的内容缩放以适应新的帧大小。

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

您可以找到contentMode here的所有可能值。

答案 1 :(得分:0)

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

Scrolling Using Paging Mode

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