我一直在乱搞并试图创建自己的消息传递应用程序(用于练习)。
我正在根据UIView
向标准UIScrollView
添加自定义IBAction
。
每次用户按下按钮时,我都会按顺序执行以下操作:
int
来设置新自定义的y位置
图UIView
,其框架大小仅在宽度上有所不同。该视图顶部有UILabel
,其中包含文字。CGSize
,用于设置contentSize
UIScrollView
。新的CGSize
是scrollView +的宽度
自定义视图的高度+一些填充。我创建了一个定时器,每隔两秒就会添加一条新消息/子视图来测试多条消息,我看到的问题是,一旦将子视图添加到UIScrollView
的可查看区域之外,他们就会停止添加。只有在我将消息带回可视区域后才会添加它们,即便如此,它们有时也会叠加。
现在,我知道一些事情:我需要在单独的线程上添加子视图,因为在用户滚动时不会添加子视图。我知道我需要在他们积累时“清理”子视图,因为我的应用程序会随着更多子视图的添加而继续占用内存。我也知道我应该在添加消息时重新定位UIScrollView
,因为将它们添加到可查看区域之外是没有意义的。最后,我不认为枚举子视图是非常优雅的......所以我稍后会改变它......我也不会改变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];
}
}
有关为什么仅在视图中添加子视图的任何想法?另外,关于如何有效地做到这一点的任何想法?
提前感谢您的帮助!
答案 0 :(得分:0)
在阅读帖子时我注意到的几件事情:
UITableView
来显示消息?如果你使用表视图,你不必计算所有的帧,内容大小等,只需要给单元格提供正确的高度,这将是解决你想要实现的目标的有效方法。希望这很有帮助,祝你好运!