创建免责声明屏幕,用户必须一直向下滚动

Posted

技术标签:

【中文标题】创建免责声明屏幕,用户必须一直向下滚动【英文标题】:Create disclaimer screen where user has to scroll all the way down 【发布时间】:2013-07-08 15:18:19 【问题描述】:

我需要创建一个包含长文本(已本地化为不同语言)的免责屏幕。

用户应该向下滚动到文本的底部,然后看到“同意”按钮。

由于警报相当有限,我创建了一个 UIViewController,并将 ScrollView 放入其中。

现在我在这个 Scrollview 中放了一个 TextView - 但问题是这个 TextView 本身不应该是可滚动的,而是应该具有它所包含的完整文本所需的确切大小(这对于每种语言和总是超过屏幕高度可以保持而不滚动)然后在那个长的TextView下我需要定位UIButton。

TextView + Button 都在 ScrollView 中。

由于 UITextView 具有不同的高度,具体取决于当前语言 - 我如何正确设置这个完整的屏幕 - 理想情况下使用 IB。或者如果不能以编程方式实现?

或者有完全不同的更简单的方法吗?

【问题讨论】:

你不应该需要一个专用于它的整个视图控制器。 UIAlertView 应该自动创建一个带有适当按钮的可滚动文本框! 但是按钮是可见的,即使文本没有向下滚动到按钮 - 我需要确保用户向下滚动了完整的文本! 哦,好吧,在这种情况下,它可能会有点棘手。您可以将免责声明放在几个不同的弹出窗口中,并让它们在多种情况下关闭或同意。 你到底在说多少文字? @user387184 不要使用UITextView。使用UILabel。将标签和按钮添加到滚动视图。诀窍是确保标签的大小完全适合文本,而不管语言如何,并且按钮需要位于标签下方。 【参考方案1】:

将 UILabel(行数设置为 0)及其下方的按钮添加到滚动视图。设置约束,使按钮在标签底部具有垂直间距约束。给标签一个固定的宽度约束和一个高度约束。为高度约束创建一个 IBOutlet,并使用从 sizeWithFont:constrainedToSize:lineBreakMode: 获得的值在代码中调整该约束的常量参数。您还需要使用相同的值加上适合按钮所需的大小来调整滚动视图的 contentSize。这将导致标签根据其包含的文本具有正确的高度,并且您的按钮将始终位于该标签下方的设定距离。

- (void)viewDidLoad 
    [super viewDidLoad];
    self.label.text = @"dfkl;jfjdfkjf sdfl klf;jskdl;fja skfjdklfj skdlfjs dklfjsklfj sklfjskl;f jks;alfjsk;lfjs;klfj;kfjs;kljk;lfjskdfj;klf j;klf jkl;fj;klfj;klfj k;fs;klfjsk;lfj ;klfjk;alfjk;alfjk;lfjk;lfjlkf kl;ajf akl;sfj sk;fk;lfjsk;ldfjsk;lfjsk;lfjsklfjkl;s fjklsafj kslfjkl fjklasfjklajfklafjaksdlfj lsdkf jsklfskl;f skld fjlk;sfklsfj ksff;kjdsfj sfkl;fkl;fklklfjlk;";
    CGSize labelSize = [self.label.text sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(280, CGFLOAT_MAX)]; // 280 is the width of the label set in IB
    self.heightCon.constant = labelSize.height;
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, labelSize.height +120);


在此示例中,heightCon 是 IBOutlet 到 IB 中制作的标签的高度约束。我在 viewDidLoad 中执行了此操作,但您需要在使用文本填充标签的任何位置执行此操作。

【讨论】:

非常感谢 - 现在让标签调整大小,btn 也正确定位 - 只是滚动视图不会改变它的高度 - 即使在调试时它会打印正确的高度。怎么可能?我还将scrollviews“底部空间到superview”的优先级降低到1,但它仍然没有调整大小。你能告诉我还有什么可能导致这种情况吗? 检查你的约束以防它不起作用 - 这个解决方案是完美的 + 可以理解的 + 干净的恕我直言。不过和 android 相比,ios 这么简单的事情要付出多大的努力和多么复杂,我还是觉得很可笑。 @user387184,您是在更改滚动视图本身的大小,还是更改其 contentSize?【参考方案2】:

您不应该需要一个专用于它的整个视图控制器。 UIAlertView 应该自动创建一个带有适当按钮的可滚动文本框!

下面是简单的几行。不要忘记在头文件中设置 UIAlertViewDelegate:

NSString *message = @"This is a test message.\n\nYou should avoid this and that\n\nThis goes to the next line.";
NSString *title = @"Disclaimer";

[[[UIAlertView alloc] initWithTitle:title message:message delegate:self    cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil] show];

【讨论】:

这不符合要求用户在点击按钮之前滚动浏览所有消息的规定要求。【参考方案3】:

我解决这个问题的方法是创建一个 UITableViewController(称为 DisclaimerViewController)。第一行显示文本。第二行是接受单元格,第三行是拒绝单元格。

在新的 UITableViewController 中创建协议和委托。协议应该有接受和拒绝的选择器。委托应允许任何符合新协议的对象。

从您的 Presenting ViewController 中,显示新的 DisclaimerViewController 模式。确保将委托设置为 self 并实现协议。由于接受和拒绝单元格位于 UITableView 的底部,因此您知道用户滚动到底部。没有其他方法可以让他们点击接受和拒绝单元格。

这似乎需要做很多工作,而且确实如此。但是现在,如果在其他任何地方我需要免责声明文本,我可以重复使用此代码而无需更改代码。

【讨论】:

以上是关于创建免责声明屏幕,用户必须一直向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

用户单击信息图标后抛出免责声明文本的最简单方法?

如何将 SingleChildScrollView 居中但使背景拉伸以填满屏幕?

当用户向下滚动时,材质浮动操作按钮应该不可见,向上滚动时应该可见

React Native:Android 软键盘将 View 向上推

向下滚动时隐藏屏幕的一部分

在手机上,检测用户何时滚动“过去”屏幕顶部