向 UIScrollView 添加多个子视图

Posted

技术标签:

【中文标题】向 UIScrollView 添加多个子视图【英文标题】:Adding multiple subviews to UIScrollView 【发布时间】:2013-11-28 04:47:37 【问题描述】:

我一直在搞砸并尝试制作自己的消息传递应用程序(用于练习)。 我将自定义UIView 添加到基于IBAction 的标准UIScrollView

每次用户按下按钮时,我都会执行以下操作(按顺序):

枚举scrollView中的子视图,增加一个值 整数。我使用这个int 来设置新自定义的 y 位置 查看 创建一个自定义UIView,其框架大小仅在宽度上有所不同。视图顶部有一个 UILabel,其中包含文本。 创建一个新的CGSize,我用它来设置contentSize UIScrollView。新的CGSize 是 scrollView 的宽度 + 自定义视图的高度 + 一些填充。 然后我设置 scrollView 的 contentSize。 然后我将自定义视图添加为 scrollView 的子视图。

我创建了一个计时器,它每两秒添加一条新消息/子视图以测试多条消息,我看到的问题是,一旦将子视图添加到 UIScrollView 的可视区域之外,它们就会停止添加了。仅当我将消息带回可视区域时才会添加它们,即使如此,它们有时也会叠加添加。

现在,我知道一些事情:我需要在单独的线程上添加子视图,因为它们不会在用户滚动时添加。我知道我需要在子视图建立时“清理”它们,因为随着更多子视图的添加,我的应用程序将继续消耗内存。我也知道我应该在添加消息时重新定位UIScrollView,因为将它们添加到可视区域之外是没有意义的。最后,我认为枚举子视图不是很优雅......所以我稍后会改变它......我制作的 temp UILabel 也不是......现在一些代码:

- (void)pushMyMessage:(NSString *)message

UILabel *tempLabel = [[UILabel alloc]init];
tempLabel.text = message;
[tempLabel sizeToFit];

//adding the new message as a subview below any previous messages
    if (self.messageView.subviews.count > 0)
    
        int yIndex = 0;

        for (SDMessageView *view in self.messageView.subviews)
        
        //increase the y value for the frame of the next message
        yIndex += view.frame.size.height;
        //add a little padding
        yIndex += 5;
        

    SDMessageView *newMessage = [[SDMessageView alloc]initWithFrame:CGRectMake(20, yIndex, tempLabel.frame.size.width + 8, tempLabel.frame.size.height) setMessage:message];
    CGSize newSize = CGSizeMake(self.messageView.frame.size.width, self.messageView.contentSize.height + newMessage.frame.size.height + 30);
    [self.messageView setContentSize:newSize];
    [self.messageView addSubview:newMessage];
    
else
    
    //initial message
    SDMessageView *newMessage = [[SDMessageView alloc]initWithFrame:CGRectMake(20, 20, tempLabel.frame.size.width + 8, tempLabel.frame.size.height) setMessage:message];
    CGSize newSize = CGSizeMake(self.messageView.frame.size.width, self.messageView.contentSize.height + newMessage.frame.size.height + 30);
    [self.messageView setContentSize:newSize];
    [self.messageView addSubview:newMessage];
    

关于为什么只在视图中添加子视图的任何想法?另外,关于如何有效地做到这一点有什么想法吗?

提前感谢您的帮助!

【问题讨论】:

我建议你应该使用 UITableView 而不是滚动视图,并在一个单元格中设置你的消息视图,使用表格视图将非常容易管理 UI。我找到了一些链接,您可以在其中看到一些 ios 原生消息应用程序,如 UI,您可以对其进行修改,并可以根据需要使用。 1) maniacdev.com/2013/03/… 2) maniacdev.com/2012/08/… @VishwaPatel - 太棒了。我会调查的。 【参考方案1】:

阅读您的帖子时我注意到的几件事:

    您不应该在辅助线程上进行任何 UI 界面更改(例如添加子视图),这应该在主线程上完成。 为什么不使用UITableView 来显示消息?如果您使用表格视图,则不必计算所有框架、内容大小等,只需为单元格提供正确的高度,这将是解决您想要实现的目标的有效方法。 我不太明白,为什么你的子视图没有添加到滚动视图的隐藏区域,在我的实践中,我没有注意到滚动视图的这种行为(我经常使用它),那里应该是您的代码的其他问题(您是否在辅助线程上添加子视图?)。

希望对您有所帮助,祝您好运!

【讨论】:

1.真的吗?我认为在辅助线程上添加子视图将使用户能够继续向上/向下滚动或转到新选项卡。在将消息/子视图添加到屏幕之前将消息发送到服务器......我不确定那里的最佳做法是什么。 2. 我完全忽略了UITableView。我很可能会切换到那个。 3. 我唯一能想到的是我如何计算定位新子视图的 yIndex。要么,要么是模拟器的错误。在我更新我的开发帐户之前,我一直在使用模拟器。

以上是关于向 UIScrollView 添加多个子视图的主要内容,如果未能解决你的问题,请参考以下文章

添加多个子视图的最佳方法 UIViewControllers

在ios中添加多个子视图

自动布局的 UIScrollView 内容大小问题

UIScrollView 中的 UIView 尊重一些约束,但不尊重其他约束

给 UIView 添加多个子层只会显示一个

Oracle Sql:如何在 sql 中添加多个子总计?