如何以编程方式增加具有约束的 UIScrollView 的高度?

Posted

技术标签:

【中文标题】如何以编程方式增加具有约束的 UIScrollView 的高度?【英文标题】:How to increase the height, programmatically, of a UIScrollView that has constrains? 【发布时间】:2017-02-02 02:05:04 【问题描述】:

我是这个 ios 应用程序世界的新手,我正在开发一个需要显示项目详细信息的应用程序。这个细节可以接收来自用户的 cmets,我需要的是每次细节得到一个新的评论时我的屏幕高度就会增加,这就是我所做的,这就是屏幕:

Scroll 的约束是:Trailing、Leading、top 和 bottom 到其父视图。 对于视图内容:与其父视图的尾随、前导、顶部和底部,在 x 和 y 中对齐中心,并等于父视图的高度和宽度。

所有的cmets都来自一个服务,我想要增加内容。我展示了所有的 cmets,但 UIScrollView 不起作用。我认为是因为限制

这是我如何加载和打印 cmets 并更改我的滚动视图的内容:

    int y  = bottomLine.frame.origin.y + 8;
    int numComments = [[content objectForKey:@"comments"] intValue];

    if (numComments > 0) 
        for (int j=0; j < [comments count]; j++) 

                commentData = [comments objectAtIndex:j];

                //Create all the elements
                viewComments = [[UIView alloc] initWithFrame:CGRectMake(8, y, self.view.bounds.size.width - 16, 109)];
                viewComments.backgroundColor = [UIColor grayColor];

                UIImageView *viewImgComment = [[UIImageView alloc] initWithFrame:CGRectMake(8, 8, 50, 50)];

                NSURL *linckImage = [NSURL URLWithString:[commentData objectForKey:@"image"]];
                [viewImgComment sd_setImageWithURL:linckImage placeholderImage:[UIImage imageNamed:@"place_holder_user"]];
                viewImgComment.layer.cornerRadius = 25;
                viewImgComment.clipsToBounds = YES;

                UILabel *lblTituloComment = [[UILabel alloc] initWithFrame:CGRectMake(50 + 16, 8, (viewComments.bounds.size.width - 74) , 17)];
                [lblTituloComment setText:[commentData objectForKey:@"name"]];
                [lblTituloComment setFont:[UIFont systemFontOfSize:14.0f]];

                UIView *viewRating = [[UIView alloc] initWithFrame:CGRectMake(50 + 16, 17 + 16, 121, 23)];
                viewRating.backgroundColor =[UIColor blackColor];
                viewRating.layer.cornerRadius = 11;

                UILabel *lblDescripcionComment = [[UILabel alloc] initWithFrame:CGRectMake(8, 50 + 8, (viewComments.bounds.size.width - 16), 43)];

                [lblDescripcionComment setText:[commentData objectForKey:@"comment"]];
                [lblDescripcionComment setFont:[UIFont systemFontOfSize:14.0f]];
                [lblDescripcionComment setNumberOfLines:0];

                y = y + 117;

                [viewComments addSubview:viewImgComment];
                [viewComments addSubview:lblTituloComment];
                [viewComments addSubview:viewRating];
                [viewComments addSubview:lblDescripcionComment];

                [masterScroll addSubview:viewComments];
            
        
        //Increase the content size
        masterScroll.contentSize = CGSizeMake(self.view.bounds.size.width, y);

我希望有人能帮助我,我已经尝试了 3 天,研究和询问。有任何问题或对某事的任何解释,请告诉我。

【问题讨论】:

您能告诉我,对于 cmets,您使用的是 table view 还是 uiview?如果表视图没有问题。如果您使用的是 uiview,那么您需要进行一些更改。不是什么大问题。告诉我吧。 当然,我正在使用 uiview。 1.在添加评论之前记录当前高度。添加评论后,计算该视图的高度。查找先前高度和当前高度之间的差异。 2.转到故事板->选择滚动视图的高度约束->为该约束创建一个出口。 -> 现在去代码 -> heghtConstraint.constant = differenceHeight+currentHeightOfScrollView. 【参考方案1】:

首先你必须得到你的标签高度(带有标签的内容文本)。

- (CGFloat)getLabelHeight:(UILabel*)label

    //Here label is your Comment label.
    CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [label.text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@NSFontAttributeName:label.font
                                                  context:context].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
    return size.height;

获取您的评论标签高度并设置滚动视图内容大小:

CGSize *size;
CGFloat height =  [self getLabelHeight:lblDescripcionComment];
NSLog(@"totalHeight :%f",[self getLabelHeight:lblDescripcionComment]);
lblDescripcionComment.frame = CGRectMake(18, 260, 220, height);

#Here h is your scrollview height without comment label.
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width,h+height)];

【讨论】:

以上是关于如何以编程方式增加具有约束的 UIScrollView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将纵横比约束应用于自定义 UICollectionViewCell?

以编程方式添加具有相对约束问题的标签

以编程方式为不同大小类创建具有不同常量的自动布局约束

以编程方式添加具有约束的多个子视图会引发异常

iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突

以编程方式构建带有约束的titleView(或通常构建带有约束的视图)