添加为子视图后,ScrollView 不会滚动

Posted

技术标签:

【中文标题】添加为子视图后,ScrollView 不会滚动【英文标题】:ScrollView won't scroll after adding as subview 【发布时间】:2013-02-17 17:41:06 【问题描述】:

所以我通过按下分段工具将带有 UIScrollView 的 UIView 添加到另一个视图:

UIView.h

@interface gettingELORolesViewController : UIViewController
    UIViewController *currentController;
    NSMutableArray *viewControllers;

- (IBAction)SegmentToggle:(UISegmentedControl *)sender;
@property (strong, nonatomic) IBOutlet UIView *containerView;

UIView.m

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard_iPhone"
                                                  bundle:nil];

 firstView *FirstView = [sb instantiateViewControllerWithIdentifier:@"firstOne"];
 secondView *SecondView = [sb instantiateViewControllerWithIdentifier:@"secondOne"];

 viewControllers = [NSMutableArray arrayWithObjects:FirstView,SecondView,nil];

 currentController = FirstView;

 [containerView addSubview:FirstView.view];//containerView = self.view

然后根据选择的段,显示不同的视图:

- (IBAction)SegmentToggle:(UISegmentedControl *)sender 
    UIViewController *selectedView=nil;

    if (sender.selectedSegmentIndex==0) 
        selectedView= [viewControllers objectAtIndex:0]; // retrieve object at index 0 from viewControllers array

    
    else if(sender.selectedSegmentIndex==1)    
        selectedView= [viewControllers objectAtIndex:1]; // retrieve object at index 1 from viewControllers array

    

    [currentController.view removeFromSuperview]; // remove Current displaying view from superView
    currentController=selectedView; // make selected View to be the current View
    [containerView addSubview:selectedView.view]; // Add newly selected view on container View

secondView 是 tableViewController,当我选择第二段时,一切都很好。当我选择第一个时,它会出现,但滚动不起作用,我不知道为什么。

firstView.m viewDidLoad 方法如下所示:

-(void)viewDidLoad
    [super viewDidLoad];
    mainScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [mainScrollView setContentSize:CGSizeMake(320, 600)];
    [mainScrollView setScrollEnabled:YES];

在storyBoard 中启用了分页。它与 firstView 的 .h 文件挂钩。 请告诉我我做错了什么。

【问题讨论】:

请贴出firstView.m的所有布局代码。你真的打电话给[self.view addSubview:mainScrollView]; 吗? 我更新了问题 【参考方案1】:

当你拨打-SegmentToggle:时,

你创建了一个名为selectedView的局部变量 根据选择的段,您将视图控制器分配给 selectedView 方法结束,selectedView 超出范围

简而言之,你什么也没做。您至少应该将当前视图层次结构中的视图替换为所选控制器的视图(并且可能将对所选控制器的引用存储在实例变量中以供以后查找?)

但退后一步,您似乎正在尝试创建一个管理其他视图控制器的视图控制器。从 ios 5 开始,现在有非常具体的规则。请观看名为“Implementing UIViewController Containment”的WWDC 2011 video 以获取更多信息和示例。

【讨论】:

您也没有向我们展示currentController 是如何定义的,所以我们在同一条船上。但无论如何我的建议是一样的。观看视频。您不想将新的托管子视图扔到本身已经由控制器管理的视图中,有几个原因。该视频解释了这样做的原因和正确的方法。 或者,如果您不是电影类型,here's a blog post 会涵盖大部分相同的内容。

以上是关于添加为子视图后,ScrollView 不会滚动的主要内容,如果未能解决你的问题,请参考以下文章

向上推键盘 Swift iOS 后,我的 Scrollview 不会一直向上滚动

具有自定义视图的 ScrollView 不会滚动 - android?

当内容适合滚动视图边界时,SwiftUI ScrollView 不会使内容居中

scrollView 中scrollView 的水平滚动 - 小问题

当作为子视图添加到集合视图单元格时,滚动视图中的内容不可见

ScrollView 滚动到底部问题