向 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