【问题标题】:Convert UIViewController to UIScrollViewController将 UIViewController 转换为 UIScrollViewController
【发布时间】:2012-07-06 07:12:04
【问题描述】:

我是 iPad 开发者的新手,

当我在Portrait 模式下看到我的应用程序时,我在我的应用程序中制作了一个注册表单, 我可以在没有滚动的情况下看到整个表单,但是当我在Landscape 模式下看到相同的表单时,我无法看到页面底部的部分,因为应该有滚动才能看到底部。

: 当我替换时在我的.h 文件中

@interface ReminderPage : UIViewController{
...
...
}

:UIViewController:UIScrollView

然后当我像这样在.m 文件中添加标签时,

UILabel *Lastpaidlbl = [[[UILabel alloc] initWithFrame:CGRectMake(70 ,400, 130, 50)]autorelease];
    Lastpaidlbl.backgroundColor = [UIColor greenColor];
    Lastpaidlbl.font=[UIFont systemFontOfSize:20];
    Lastpaidlbl.text = @"Lastpaid on :";
    [self.view addSubview:Lastpaidlbl];

最后一行出现错误在类名类型的对象上找不到属性视图。 我无法在视图中添加标签。

我们将不胜感激。

【问题讨论】:

  • 通常在 Obj-C 中使用 camel notation 作为变量名。它使我们更容易阅读
  • 如果您将 UIViewController 替换为 UIScrollView,我预计您的应用程序甚至无法编译,如果编译,您将立即崩溃并显示明显的错误消息。因此,您不能按照您的问题所说的那样做。请阅读视图和视图控制器之间的区别。

标签: iphone ipad uiviewcontroller uiscrollview uilabel


【解决方案1】:

这个问题似乎真的是在问如何将屏幕上的所有组件放置在 UIScrollView 中,而不是 UIView 中。使用 Xcode 4.6.3,我发现我可以通过以下方式实现:

  • 在 Interface Builder 中,选择主 UIView 内的所有子视图。
  • 选择 Xcode 菜单项“编辑器 | 嵌入 | 滚动视图”。

最终结果是在现有的主 UIView 中嵌入了一个新的滚动视图,UIView 的所有以前的子视图现在都作为 UIScrollView 的子视图,具有相同的定位。

【讨论】:

    【解决方案2】:

    如果您想用 UIScrollView 替换您的 UIViewController,您将不得不对您的代码进行一些重构。你得到的错误只是一个例子:

    语法:

    [self.view addSubview:Lastpaidlbl];
    

    如果self 是 UIViewController 则正确;既然你把它改成了UIScrollView,你现在应该这样做:

    [self addSubview:Lastpaidlbl];
    

    您将需要对代码进行很多类似这样的更改,并且会遇到一些问题。

    另一种方法是:

    1. 实例化一个 UIScrollView(不是从它派生的);

    2. 将您的 UIView(如您定义的那样)添加到滚动视图;

    3. 定义滚动视图的contentSize,以便包含您拥有的整个 UIView。

    滚动视图充当现有视图的容器(您将控件添加到滚动视图,然后将滚动视图添加到 self.view);这样,您可以将其集成到现有控制器中:

          1. UIScrollView* scrollView = <alloc/init>
    
          2. [self.view addSubview:scrollView]; (in your  controller)
    
          3. [scrollView addSubview:<label>]; (for all of your labels and fields).
    
          4. scrollView.contentSize = xxx;
    

    我认为后一种方法会容易得多。

    【讨论】:

      【解决方案3】:

      请将你所有的 UIComponents 放到 UIScrollview 中,然后它会开始滚动。

      请查看内容大小。请根据设备方向更改。

      【讨论】:

      • 我不想根据方向改变内容的大小。我想在视图中滚动。或者如何向 UIScrollView 添加组件?
      • 如果您使用的是 XIB 文件,请获取滚动视图并将其放在主视图之外并使其高度大于屏幕尺寸,然后将所有其他 ui 组件放到该滚动视图中。完成放置 UIComponents 后,将滚动视图放到主视图中。并在检查员的帮助下定义内容大小。 (那么就不需要一次又一次地改变内容大小)
      【解决方案4】:

      您正在继承UIScrollView,因此没有self.view,因为self 已经是(滚动视图的)视图。您不需要子类化滚动视图,您可以将组件嵌入到 ivar 滚动视图中并设置其contentSize(在您的情况下,您必须在设备处于横向模式时启用滚动)。在界面生成器中,您可以一键嵌入所选元素,编辑器->嵌入->滚动视图。

      【讨论】:

        【解决方案5】:

        首先创建滚动视图

         UIScrollView *  scr=[[UIScrollView alloc] initWithFrame:CGRectMake(10, 70, 756, 1000)];
            scr.backgroundColor=[UIColor clearColor];
            [ self.view addSubview:scr];
        

        更改[self.view addSubview:Lastpaidlbl];

              to
        

        [scr addSubview:Lastpaidlbl];

        第三

        设置高度取决于内容

        UIView *view = nil;
        
         NSArray *subviews = [scr subviews];
        
        
         CGFloat curXLoc = 0;
        
            for (view in subviews)
            {
                CGRect frame = view.frame;
                curXLoc += (frame.size.height);
            }
               // set the content size so it can be scrollable
            [scr setContentSize:CGSizeMake(756, curXLoc)];
        

        终于

        - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
            // Override to allow orientations other than the default portrait orientation.
            if (interfaceOrientation==UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight) {
                self.scr.frame = CGRectMake(0, 0, 703,768);    
        
                } else {
                self.scr.frame = CGRectMake(0, 0, 768, 1024);
                }
        
        
            return YES;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-11-06
          • 2012-09-21
          • 2016-08-21
          • 1970-01-01
          • 2011-09-13
          • 1970-01-01
          • 2016-01-04
          • 1970-01-01
          • 2014-03-19
          相关资源
          最近更新 更多