编辑:下面的详细问题的简化版本:是否可以通过子类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];

}

最佳答案

边界更改时,UIView的行为由contentMode属性确定。

如果您查看documentation,您将看到:

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

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

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

您可能需要将视图的contentMode更改为不失真的行为,例如UIViewContentModeTop,它将使内容在视图范围的顶部对齐。

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

关于ios - 正确使用DrawRect替代-是否可以防止 View 拉伸(stretch)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15751305/

10-09 16:24