调整 UIView 的大小以便 UIScrollView 工作

Posted

技术标签:

【中文标题】调整 UIView 的大小以便 UIScrollView 工作【英文标题】:Resizing a UIView so UIScrollView works 【发布时间】:2012-01-14 21:08:46 【问题描述】:

我有一个主要在界面生成器中构建的小表单:

当用户触摸其中一个文本字段时,我将屏幕的顶部设为可滚动(请注意,当键盘不存在时它不需要任何滚动,并且两个字段都不会隐藏在键盘后面)。

我用很少的代码实现了这一点。我的表单控件都在 UIScrollView 内,加载时它被禁用并且大小为 0x0(默认情况下)。当我检测到键盘的存在时,我启用它并将其调整为 视图的宽度视图的高度 + 键盘大小。然后在移除键盘时禁用滚动视图并调整其大小(我将其设置回 0x0)。

这几乎可以完美运行。除了一个例外(到目前为止):

可滚动区域(或者更确切地说,其中的视图)太高。因为没有键盘的表单不占整个屏幕,我发现我可以滚动到我的视图底部(一个全屏)+键盘高度,而我真正想要的是滚动到视图的 内容 + 键盘高度。

我想我可以简单地缩短视图,使其大小正好适合内容,但界面生成器(xcode 4.2)似乎迫使它占据整个屏幕。尝试在代码中执行此操作也不起作用,因为显然 self.view.frame.size 是不可分配的。我怎样才能实现我正在寻找的东西?具体来说,当键盘出现时,我希望屏幕上半部分的可滚动区域调整大小,以便底部没有太多“松弛”:

【问题讨论】:

【参考方案1】:

首先,self.view.frame 是一个结构体,它有两个字段,它们本身就是结构体——大小和原点。如果要更改大小或原点,则必须更改整个框架

self.view.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y, 
    self.view.frame.size.width, <your desired height>);

其次,使用什么基础来创建表单?这看起来只是一个 UITableVIew。如果是这样,请考虑将 UIViewController 的类型更改为 UITableViewController,因为它会自动处理键盘。

如果两者都不适合您,请提供您在处理键盘外观时使用的代码,以便我们想出更具体的答案。

【讨论】:

这些主要是 UITextFields,只是样式化了一点。最下面的 Department 是一个 tableview。 @BenPackard 我认为您还应该尝试修改 scrollView 的 contentSize 属性。好像你只改变了scrollView的frame,但是contentSize不变,contentSize决定了scrollView的内容会滚动多少。 谢谢。因此,我现在使用 gavrix 的答案手动强制视图在加载时变小,然后当键盘弹出时,我正在设置内容大小。在这两个中,我都提供了浮动,感觉不是很可重用,但工作正常。当我撤消这些更改时,我遇到了一个小问题 - 视图“弹回”而不是滚动。现在正在努力。 @BenPackard 为避免这种情况,您应该使用动画更改帧,查看键盘通知的 userInfo 中提供的内容 - 系统将用于键盘动画的一些动画参数,可用于你的动画。 谢谢,我去看看。我已经注意到“动画键/值对仅适用于“意志”系列通知。目前我正在收听“键盘已显示”的音符 - 我应该切换到“键盘将显示”音符吗?进行此更改是否有任何其他副作用?

以上是关于调整 UIView 的大小以便 UIScrollView 工作的主要内容,如果未能解决你的问题,请参考以下文章

使用UIToolbar调整UIView的大小不会同时调整大小

Swift:如何通过按住按钮来逐步调整 UIView 的大小

iPhone UIView - 调整框架以适应子视图

根据设备方向在 alloc/init 上设置正确的 UIView 帧大小

动画 UITableView 调整大小

如何调整 UIView 的大小并强制其子视图调整大小