【问题标题】:UIScrollView with dynamic content具有动态内容的 UIScrollView
【发布时间】:2014-05-18 06:49:59
【问题描述】:

我正在尝试实现UIScrollView,但那里的每个教程都处理预设数量的项目。

我有多个UITextField,但文本字段的数量各不相同。基本上,只要一个textField 包含文本,另一个空的就会出现在其下方,允许用户填写无限数量的文本字段。

只要用户在前一个文本字段中键入内容,我的代码就会创建一个新文本字段。这个的x-coordinates和前一个一样,但是新的y-coordinates等于前一个的高度+5px。

我正在使用情节提要,并且我已将我的原始 textField 放在 UIScrollView 中。我已将此scrollView 连接到我的代码,并以这种方式添加一个新文本字段:[self.scrollView addSubview:newTextField];

但是,当textFields 的数量超过scrollView 时,我无法滚动显示已添加的新数量。

我该怎么做呢?我认为我没有完全理解 setContentSize 的东西,所以它可能与此有关。下面是一些图片和代码来解释我的问题:

添加新文本字段的代码:

UITextField *newTextField = [[UITextField alloc]initWithFrame:CGRectMake(textField.frame.origin.x, textField.frame.origin.y + textField.frame.size.height+5, textField.frame.size.width, textField.frame.size.height)];
newTextField.placeholder = @"Add more text";
newTextField.borderStyle = UITextBorderStyleNone;
newTextField.font = [UIFont systemFontOfSize:14];
newTextField.autocorrectionType = UITextAutocorrectionTypeYes;
newTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
newTextField.autocapitalizationType = UITextAutocapitalizationTypeSentences;
newTextField.returnKeyType = UIReturnKeyDone;
[newTextField setTag:textFieldTag];
newTextField.delegate = self;
[self.scrollView addSubview:newTextField];

故事板:

在这里你可以看到我是如何在滚动视图中放置原始文本字段的

它在模拟器中的样子:

当您在文本字段中输入文本时,会发生这种情况:

一个空的文本域出现在前一个文本域的下方。

但是,当您超出 ScrollView 时,就会发生这种情况

您无法再看到新的 textField,因为它位于 scrollView 的边界之下。你也不能滚动显示它。


有谁知道如何解决这个问题?如果你有时间,你会怎么做才能让滚动视图自动向下滚动以显示已添加的新文本字段?

非常感谢任何帮助!谢谢!

【问题讨论】:

  • 您为什么决定不使用表格视图?它似乎更适合这个问题。
  • 我考虑过使用 tableview,但最终决定不使用它,因为屏幕上的信息将比您从图像中看到的更多(其中包括右侧的图像等等)。但是,如果这是不可能的,tableview 是我的备用解决方案。
  • 发布更新代码contentSize
  • 注意:它应该类似于self.scrollView.contentSize = CGSizeMake(CGRectMaxX(newTextField.frame), CGRectMaxY(newTextField.frame))
  • 正如我所说,我不太明白contentSize 的事情。它应该是内容的大小吗?实际UIScrollView 的大小是否重要?我应该在哪里设置它?至于现在,我已经在ViewDidLoad 函数中将它设置为一个随机(小)数字,以查看它是否会滚动,但它不会。我最初的contentSize 应该是什么?我应该在添加新文本字段时更新它吗?

标签: ios objective-c xcode uiscrollview


【解决方案1】:

contentSize 需要是滚动视图中包含的内容的大小。

如果contentSizebounds.size 宽,那么您可以左右滚动。如果contentSizebounds.size 高,那么您可以上下滚动。

您需要将contentSize 设置为您希望包含在滚动视图中的整个区域。

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(textField.frame.origin.x, textField.frame.origin.y + textField.frame.size.height+5, textField.frame.size.width, textField.frame.size.height)];
textField.placeholder = @"Add more text";
textField.borderStyle = UITextBorderStyleNone;
textField.font = [UIFont systemFontOfSize:14];
textField.autocorrectionType = UITextAutocorrectionTypeYes;
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
textField.autocapitalizationType = UITextAutocapitalizationTypeSentences;
textField.returnKeyType = UIReturnKeyDone;
textField.tag = textFieldTag;
textField.delegate = self;

[self.scrollView addSubview:textField];

// Update the contentSize to include the new text field.
CGFloat width = self.scrollView.bounds.size.width;
CGFloat height = CGRectGetMaxY(textField.frame);
self.scrollView.contentSize = CGSizeMake(width, height);

注意事项:

  • 不要以new 开头变量或方法。它具有特殊含义,您会混淆其他 Objective-C 开发人员和/或编译器。
  • textField.tag = …[textfield setTag:…]; 一样,你好像喜欢其他地方的点语法,所以我换了。
  • 我假设您不希望滚动视图左右平移,所以我将内容宽度固定到滚动视图的宽度。

【讨论】:

  • 什么是CGRectMaxY?编译器似乎不喜欢它,我在网上找不到任何关于它的信息。它说 函数 'CGRectMaxY' 的隐式声明在 C99 中无效
  • 我应该将 contentSize 初始化为什么?我从文本字段self.textField2 开始,那么我应该在viewDidLoad 中添加什么?
  • @Alekplay 应该是CGRectGetMaxY
  • contentSize 是上下文的区域。您只需要一个完全包含您的内容的 Rect 。如果您的内容只有 1 个文本字段,那么您可以将其设置为该文本字段的大小。
  • 好的,谢谢!我一回到我的电脑就试试!我会让你知道它是否有效! :)
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 2011-04-20
  • 2015-02-03
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多