刚做时,考虑不周,使用了UIViewController,现在才发现,里面内容很多,经常发生键盘挡住要输入的文本框,想改成UIStrollView,实现滚动,以避免遮挡,是不是界面要重做一遍,真是亏大了,请问有简单点的方法把UIViewController改成UIStrollView? 或者给UIViewController加滚动条,能加吗?

解决方案 »

  1.   

    什么样的界面效果? 使用UIViewController是正确的,也完全可以实现你要的效果。如果在UITextfield or UITextview等control在聚集focus时弹出的键盘遮挡住了输入控件本身,你可以通过调整uiviewcontroller‘s view的frame来实现 。 在UItextfield的代理方法textFieldShouldBeginEding: 中触发focus。-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
           if (self.view.frame.origin.y == 0 ) {
                       [UIView animateWithDuration:0.3f animations:^{
                              self.view.frame=CGRectOffset(self.view.frame, 0, -50); ////// 向上偏移的位置根据需要相应的调整
                       }];
           }
           return YES;
    }当然你还要处理当键盘消失时viewcontroller's view的frame还要还原为初始的状态。
      

  2.   

    直接重写VC的loadView方法
    把self.view替换为scrollView
      

  3.   

    在viewcontroller上面建一个scrollview,设置frame和contensize  ,contentsize比当前视图的frame大就行了,你再把textfiled建在scrollview上面就没有键盘遮挡的问题,当然你通过动画移动textfiled的frame也可以做到不被键盘遮挡
      

  4.   

    如果按照这种方法操作,能够把文本框从viewcontroller拖到sctrollview上吗?还是全部文本框要删除重建?如何删除重建的话,全部回调函数和文本框之间的线要重新连了,还比较麻烦。
      

  5.   

    如果按照这种方法操作,能够把文本框从viewcontroller拖到sctrollview上吗?还是全部文本框要删除重建?如何删除重建的话,全部回调函数和文本框之间的线要重新连了,还比较麻烦。用代码建的textfiled就直接建在上面,如果在stroyboard在上面建的,那就用3楼的方法吧
      

  6.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
      

  7.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
    如果 View 是通过 Storyboard 来布局的话,那确实不能重写 loadView 方法了。
    但实现起来就更加简单,你只需要在 Storyboard 里把 VC 的 View 的 class 改成 UIScrollView,这样一来在运行时就是一个 ScrollView,但是它默认是不能滚动的,你需要在重写 VC 的 viewDidLayoutSubviews 方法(如果布局是固定的,那么以在 viewDidLoad 里处理也行),给 (UIScrollView *)self.view 设置 contentSize。
      

  8.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
    如果 View 是通过 Storyboard 来布局的话,那确实不能重写 loadView 方法了。
    但实现起来就更加简单,你只需要在 Storyboard 里把 VC 的 View 的 class 改成 UIScrollView,这样一来在运行时就是一个 ScrollView,但是它默认是不能滚动的,你需要在重写 VC 的 viewDidLayoutSubviews 方法(如果布局是固定的,那么以在 viewDidLoad 里处理也行),给 (UIScrollView *)self.view 设置 contentSize。
    对了,如果你有用 Auto Layout 的话,就不需要在代码里设置 contentSize 了,只需要在 Storyboard 里给 ScrollView 和它的子视图之间创建一个 bottom 约束,ScrollView 就能自动计算出 contentSize 了。
      

  9.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
    如果 View 是通过 Storyboard 来布局的话,那确实不能重写 loadView 方法了。
    但实现起来就更加简单,你只需要在 Storyboard 里把 VC 的 View 的 class 改成 UIScrollView,这样一来在运行时就是一个 ScrollView,但是它默认是不能滚动的,你需要在重写 VC 的 viewDidLayoutSubviews 方法(如果布局是固定的,那么以在 viewDidLoad 里处理也行),给 (UIScrollView *)self.view 设置 contentSize。
    对了,如果你有用 Auto Layout 的话,就不需要在代码里设置 contentSize 了,只需要在 Storyboard 里给 ScrollView 和它的子视图之间创建一个 bottom 约束,ScrollView 就能自动计算出 contentSize 了。
    谢谢。我就是用的story。按您给的建议,还有个问题不知道怎么处理。我把原来的View改成了ScrollView,这个view下面挂了很多子元素,通过autolayout布局好。但是,我不知道如何添加正确添加约束,使其能够计算出contentSize。我选最下面的一个button添加和scrollview底部的距离,但是这样出现一大堆的布局错误。
    我又尝试在scrollview下加了一个占位view,设了一个超出屏幕的高度,还是没起效。
    网上有一种方式是把所有子元素embed in一个contentview,但是一操作之后依旧是一大堆的布局错误。
      

  10.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
    如果 View 是通过 Storyboard 来布局的话,那确实不能重写 loadView 方法了。
    但实现起来就更加简单,你只需要在 Storyboard 里把 VC 的 View 的 class 改成 UIScrollView,这样一来在运行时就是一个 ScrollView,但是它默认是不能滚动的,你需要在重写 VC 的 viewDidLayoutSubviews 方法(如果布局是固定的,那么以在 viewDidLoad 里处理也行),给 (UIScrollView *)self.view 设置 contentSize。
    对了,如果你有用 Auto Layout 的话,就不需要在代码里设置 contentSize 了,只需要在 Storyboard 里给 ScrollView 和它的子视图之间创建一个 bottom 约束,ScrollView 就能自动计算出 contentSize 了。
    谢谢。我就是用的story。按您给的建议,还有个问题不知道怎么处理。我把原来的View改成了ScrollView,这个view下面挂了很多子元素,通过autolayout布局好。但是,我不知道如何添加正确添加约束,使其能够计算出contentSize。我选最下面的一个button添加和scrollview底部的距离,但是这样出现一大堆的布局错误。
    我又尝试在scrollview下加了一个占位view,设了一个超出屏幕的高度,还是没起效。
    网上有一种方式是把所有子元素embed in一个contentview,但是一操作之后依旧是一大堆的布局错误。
    方便截个图吗?加 Bottom 约束后可能会出现约束错误,这种情况下,你需要在 Storyboard 里手动调整 ScrollView 的高度,使之符合约束。
      

  11.   

    你自己在建立一个scrollview 添加到self.view. 然后把 self.view 查找替换成scrollview就行了。也是分分钟的事。
      

  12.   


    版主能否详细指导下,如果重写loadview,从而将现有的self.view替换成scrollview。
    直接新建一个scrollview的话,又如何从storyboard里构造出view结构呢?
    谢谢
    如果 View 是通过 Storyboard 来布局的话,那确实不能重写 loadView 方法了。
    但实现起来就更加简单,你只需要在 Storyboard 里把 VC 的 View 的 class 改成 UIScrollView,这样一来在运行时就是一个 ScrollView,但是它默认是不能滚动的,你需要在重写 VC 的 viewDidLayoutSubviews 方法(如果布局是固定的,那么以在 viewDidLoad 里处理也行),给 (UIScrollView *)self.view 设置 contentSize。
    对了,如果你有用 Auto Layout 的话,就不需要在代码里设置 contentSize 了,只需要在 Storyboard 里给 ScrollView 和它的子视图之间创建一个 bottom 约束,ScrollView 就能自动计算出 contentSize 了。
    谢谢。我就是用的story。按您给的建议,还有个问题不知道怎么处理。我把原来的View改成了ScrollView,这个view下面挂了很多子元素,通过autolayout布局好。但是,我不知道如何添加正确添加约束,使其能够计算出contentSize。我选最下面的一个button添加和scrollview底部的距离,但是这样出现一大堆的布局错误。
    我又尝试在scrollview下加了一个占位view,设了一个超出屏幕的高度,还是没起效。
    网上有一种方式是把所有子元素embed in一个contentview,但是一操作之后依旧是一大堆的布局错误。
    方便截个图吗?加 Bottom 约束后可能会出现约束错误,这种情况下,你需要在 Storyboard 里手动调整 ScrollView 的高度,使之符合约束。
    后来我换了种方式,在4/4s的小屏幕情景下,动态调整了部分子对象的高度,放弃用滚动了。
    关于storyboard+autolayout+uiscrollview我查了不少资料,发现无一不是加了一个中间层的container view,想想还是要重新布局,不打算在原有基础上改了。再次感谢。