将多个子视图添加到UIScrollView

时间:2013-11-28 04:47:37

标签: ios objective-c uiview uiscrollview

我一直在乱搞并试图创建自己的消息传递应用程序(用于练习)。 我正在根据UIView向标准UIScrollView添加自定义IBAction

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

  • 枚举scrollView中的子视图并增加一个值 整数。我使用此int来设置新自定义的y位置 图
  • 创建一个自定义UIView,其框架大小仅在宽度上有所不同。该视图顶部有UILabel,其中包含文字。
  • 创建一个新的CGSize,用于设置contentSize UIScrollView。新的CGSize是scrollView +的宽度 自定义视图的高度+一些填充。
  • 然后我设置了scrollView的contentSize。
  • 然后我将自定义视图添加为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];
    }
}

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

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