scrollsToTop不起作用

时间:2013-01-24 15:23:40

标签: ios uitableview uiscrollview

我正在使用PPRevealSideViewController。我有两个ViewControllers。中间的一个是SideSwipeTableViewController的子类,左边的是UIViewController的子类,里面有一个tableView。 PPRevealSideViewController和SideSwipeTableViewController的示例应用程序都支持UITableView的scrollsToTop属性,至少对于PPRevealSideViewController中间的TableView。但是当我使用这两个类时,scrollsToTop就会停止工作。

我知道这是类似的问题,但我已经尝试了一切,我已阅读所有帖子,谷歌给了我这个问题,但仍然无法解决它。所以我决定在这里问一下,即使做什么也没有任何想法,让scrollsToTop工作。

self.window.rootViewController = self.revealSideViewController;

哪里

- (PPRevealSideViewController *)revealSideViewController
{
    if (! _revealSideViewController) {
        _middleTableViewController = [MiddleTableViewController new];
        UINavigationController *middleNavController = [[UINavigationController alloc] initWithRootViewController:_middleTableViewController];
        _revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:middleNavController];
        _revealSideViewController.delegate = self;
    }

    return _revealSideViewController;
}

    - (void) preloadSidePanel
{
    AppDel.systemTableViewController = [SystemTableViewController new];
    AppDel.systemTableViewController.parent = self;
    [self.revealSideViewController preloadViewController:AppDel.systemTableViewController
                                                 forSide:isLeftHanded ? PPRevealSideDirectionLeft : PPRevealSideDirectionRight
                                              withOffset:_offset];
}

我在这个systemTableViewController中设置了这个:

_tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
[self.view addSubview:_tableView];
 _tableView.scrollsToTop = NO;

然而,它没有帮助。

6 个答案:

答案 0 :(得分:7)

滚动到顶部仅当只有一个滚动视图(或滚动视图的任何子类。在您的情况下是表视图)时才可见。

即使有多个滚动视图可见,也只有一个应该设置此属性,然后才能使用。

此外,如果委托在scrollViewShouldScrollToTop中返回NO,则它将无效。

答案 1 :(得分:5)

通过以下UIView的小扩展我解决了同样的问题。因为这些属性不仅存在于UITableView上,也存在于UIScrollView和祖先(例如UICollectionView)上。

@implementation UIView (UIViewPimp)

- (void) disableScrollsToTopPropertyOnMeAndAllSubviews {
    if ([self isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView *)self).scrollsToTop = NO;
    }
    for (UIView *subview in self.subviews) {
        [subview disableScrollsToTopPropertyOnMeAndAllSubviews];
    }
}
@end

我在viewDidLoad - 方法中调用这些新方法,然后我将所需UITableView的属性设置为显式。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view  disableScrollsToTopPropertyOnMeAndAllSubviews];
    self.myTableView.scrollsToTop = YES;
}

答案 2 :(得分:1)

如果你已经尝试过类似线程中提到的所有解决方案 并且没有成功进行“scrollsToTop修复”你只需要继承你的应用程序的主UIWindow。

@interface CustomWindow : UIWindow
@end

@implementation CustomWindow

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (point.y <= 20) {
        //do something to scroll appropriate UIScrollView to top
    }
    return YES;
}

在AppDelegate中使用:

#import "CustomWindow.h"

@interface AppDelegate : UIResponder

@property (nonatomic,strong) CustomWindow *window;

@end

此解决方案允许您将应用程序的任何UIScrollView设置为顶部,而忽略常规scrollsToTop机制。

目前您只需要有一个指向“活动”UIScrollView的全局链接。

答案 3 :(得分:1)

我希望这堂课可以提供帮助。在我的应用中,我们有多个网页浏览量和滚动视图。这使得一切变得容易。 :)

https://gist.github.com/hfossli/6776203

祝你好运!

答案 4 :(得分:0)

我以为我被乔布斯的鬼魂诅咒,因为我在StackOverflow上尝试了所有相关问题的所有可能的解决方案,而且我无法让我的滚动视图合作。

如果上述答案都不适合您 - 请确保您的tableview单元格中没有UIScrollView或子类。循环浏览视图的子视图并禁用scrollsToTop如果您的tableView尚未加载它的子视图,则无效。

对我有用的解决方案是在我的UITableViewCell子类上创建一个公共disableScrollsToTop方法,将其滚动子视图的scrollsToTop属性设置为NO

我使用的代码(名称一般化):

<强> MYViewController.m

- (void)viewDidLoad
{
    // ... your initialization code
    [self setupScrollViewScrolling];
}

- (void)setupScrollViewScrolling
{
    self.horizontalScrollView.scrollsToTop = NO;
    self.tableView.scrollsToTop = YES;
}

// Note that I am using Xibs here, and your implementation for storyboards/xibless will be slightly different. 
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:
    MyTableViewCell *cell;
    static NSString *identifier = @"IdentifierForCell";
    if (!(cell = [self.tableView dequeueReusableCellWithIdentifier:identifier])) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"MYTableViewCell" owner:self options:nil];
        cell = self.tableViewCell;
        self.tableViewCell = nil;
        // ... cell initialization code
        [cell disableScrollsToTop];
    }

    return cell;
}

当然,disableScrollsToTop只是

<强> MYTableViewCell.m

- (void)disableScrollsToTop
{
    self.subviewThatScrolls.scrollsToTop = NO;
}

另一种方式(可以说是更具可扩展性)可以做的是包装UITableView's reloadData方法,并在重新加载后调用一个递归的scrollview-checking方法,就像上面列出的@Dominic_Sander一样,虽然我没有检查过这个解决方案因为我已经弄乱了这个问题。

答案 5 :(得分:0)

我知道这是一个古老的,但希望这可以帮助。遵循如下规则:如果多个UIScrollView或其子类将其设置为YES(默认值),则scrollsToTop不起作用,则可能需要进行健全性检查以确定实际上是否正在弄乱这个行为。下面的简单方法循环遍历视图的子视图,并在视图中记录所有UIScrollView的scrollsToTop值。最好在viewDidAppear方法中调用。

Intent intent = new Intent(this, UpdateLocation.class);
            startService(intent);

这只是一个调试代码。一旦找到每个UIScrollView子类的scrollsToTop值,只​​需确保只有一个设置为YES。