【问题标题】:Multiple UIScrollViews as child view controller's in UIScrollView not scrolling to top多个 UIScrollViews 作为 UIScrollView 中的子视图控制器不滚动到顶部
【发布时间】:2014-02-10 10:38:03
【问题描述】:

我首先进行了搜索,并且看到了一些类似的问题,但没有关于如何解决它的明确答案。我的应用程序遇到的问题是我有 3 个导航控制器作为子视图控制器添加到 UIScrollView 中。我原本想改用 UIPageViewController,但结果是一团糟,因为你不能禁用它的弹跳。对于每个导航控制器,在故事板中都嵌入了一个 tableView 控制器。

没有为我的子视图控制器调用 viewDidAppear 和 viewDidDisappear,因为它们的视图在运行时作为子视图添加到分页滚动视图中,我相信这就是为什么我无法弄清楚如何解决这个问题。

我需要我的每个表格视图控制器来响应用户触摸状态栏以使相应的表格视图滚动到顶部。

这是我用于设置应用程序的主滚动视图并将 3 视图控制器的视图添加到其中的代码:

感谢您提供的任何帮助!

MainViewController.h

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController <UIScrollViewDelegate>

@end

MainViewController.m:

#import "MainViewController.h"

@interface MainViewController ()

@property (nonatomic, strong) UINavigationController *settings;
@property (nonatomic, strong) UINavigationController *hehTwo;
@property (nonatomic, strong) UINavigationController *hehOne;
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.settings = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings"];

    self.hehTwo = [self.storyboard instantiateViewControllerWithIdentifier:@"HehTwo"];

    self.hehOne = [self.storyboard instantiateViewControllerWithIdentifier:@"HehOne"];

    [self addChildViewController:self.settings];
    [self addChildViewController:self.hehTwo];
    [self addChildViewController:self.hehOne];

    CGRect hehTwoFrame = self.hehTwo.view.frame;
    hehTwoFrame.origin.x = 320;
    self.hehTwo.view.frame = hehTwoFrame;

    CGRect hehOneFrame = self.hehOne.view.frame;
    hehOneFrame.origin.x = 640;
    self.hehOne.view.frame = hehOneFrame;

    [self.scrollView addSubview:self.settings.view];

    [self.scrollView addSubview:self.hehTwo.view];

    [self.scrollView addSubview:self.hehOne.view];

    // Setting offset so the farthest right controller is heh One
    [self.scrollView setContentOffset:CGPointMake(640,0)];

    self.scrollView.delegate = self;

    self.scrollView.bounces = NO;

    self.scrollView.delaysContentTouches = NO;

    self.scrollView.contentSize = CGSizeMake(960, self.view.frame.size.height);

    self.scrollView.scrollsToTop = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat width = scrollView.frame.size.width;
    NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;

    if (page == 0)
    {
        // Settings
    }
    else if (page == 1)
    {
        // Heh Two
    }
    else
    {
        // Heh One
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

【问题讨论】:

    标签: ios objective-c uiviewcontroller ios7 uiscrollview


    【解决方案1】:

    首先,您需要在它们的 viewDidLoad 实现中将self.tableView.scrollsToTop = NO; 设置为HehTwoHehOne(如果这两个最初是隐藏的)。

    现在,更新这个方法:

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
        CGFloat width = scrollView.frame.size.width;
        NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
    
        if (page == 0)
        {
            // Settings
    
            ((UITableViewController *)self.settings.viewControllers[0]).tableView.scrollsToTop = YES;
            ((UITableViewController *)self.hehOne.viewControllers[0]).tableView.scrollsToTop = NO;
            ((UITableViewController *)self.hehTwo.viewControllers[0]).tableView.scrollsToTop = NO;
        }
        else if (page == 1)
        {
            // Heh Two
    
            ((UITableViewController *)self.settings.viewControllers[0]).tableView.scrollsToTop = NO;
            ((UITableViewController *)self.hehOne.viewControllers[0]).tableView.scrollsToTop = NO;
            ((UITableViewController *)self.hehTwo.viewControllers[0]).tableView.scrollsToTop = YES;
        }
        else
        {
            // Heh One
    
            ((UITableViewController *)self.settings.viewControllers[0]).tableView.scrollsToTop = NO;
            ((UITableViewController *)self.hehOne.viewControllers[0]).tableView.scrollsToTop = YES;
            ((UITableViewController *)self.hehTwo.viewControllers[0]).tableView.scrollsToTop = NO;
        }
    }
    

    就是这样!这应该可以解决它。

    【讨论】:

    • 今晚晚些时候我会告诉你,我确实尝试在编程之前将 tableView 的滚动设置为顶部,但它没有工作,但我也没有你提供给我的其他实现。
    • 嗯,看起来你的滚动视图比这 4 个(初始滚动视图加上这 3 个表视图)更多。
    • 我只是输入了一个 NSLog 来验证我的设置视图是否滚动到顶部“应该”滚动到顶部并且它返回是,所以你可能正在做某事。我怎样才能找到所有干扰滚动视图?
    • 问题是当前视图控制器中只有一个滚动视图应该具有 scrollsToTop = YES 并且似乎除了您希望它滚动的唯一 tableView 之外,您没有将它们全部设置为 NO到顶部。
    • 但是我所有的表格视图控制器都设置为 scrollsToTop 到 NO 在他们的视图加载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多