4

私はPPRevealSideViewControllerを使用しています。その中に2つのViewControllerがあります。中央のものは SideSwipeTableViewController のサブクラスで、左側のものは UIViewController のサブクラスで、内部に tableView があります。PPRevealSideViewController と SideSwipeTableViewController のサンプル アプリは両方とも、少なくとも PPRevealSideViewController の中間にある TableView に対して、UITableView の scrollsToTop プロパティをサポートしています。しかし、これらのクラスの両方を使用すると、scrollsToTop が機能しなくなります。

これは同様の質問であることは知っていますが、すべてを試しました。すべての投稿を読みました。Google がこの問題について教えてくれましたが、それでも解決できませんでした。だから私はここでそれを尋ねることにしました.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;

しかし、それは役に立ちません。

4

6 に答える 6

8

スクロール ビュー (またはスクロール ビューのサブクラス。あなたの場合はテーブル ビュー) が 1 つしかない場合にのみ、一番上にスクロールします。

複数のスクロール ビューが表示されている場合でも、このプロパティを設定する必要があるのは 1 つだけです。

また、デリゲートが scrollViewShouldScrollToTop で NO を返す場合、機能しません。

于 2013-01-24T15:41:57.207 に答える
5

次の小さな拡張機能を使用してUIView、同じ問題を解決しました。これらのプロパティは だけでなく、や祖先 (例: )UITableViewにも存在するためです。UIScrollViewUICollectionView

@implementation UIView (UIViewPimp)

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

viewDidLoad-Methodでこれらの新しいメソッドを呼び出してから、目的のUITableView明示的なプロパティを設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view  disableScrollsToTopPropertyOnMeAndAllSubviews];
    self.myTableView.scrollsToTop = YES;
}
于 2013-01-24T16:07:22.753 に答える
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

このソリューションを使用すると、一般的な scrollsToTop メカニズムを無視して、アプリの任意の UIScrollView を一番上にスクロールするように設定できます。

必要なのは、現時点で「アクティブな」UIScrollView を指すグローバル リンクを持つことだけです。

于 2013-03-11T18:22:52.083 に答える
1

このクラスがその一助になれば幸いです。私のアプリでは、複数の webviews と scrollviews があります。これにより、すべてがはるかに簡単になります。:)

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

幸運を!

于 2013-10-01T09:59:54.677 に答える
0

これはかなり古いものですが、これが役立つことを願っています。複数の UIScrollView またはそのサブクラスが YES (デフォルト値) に設定されている場合、scrollsToTop は機能しないという規則に従って、実際に誰がこの動作を台無しにしているかを確認するために、健全性チェックを行う価値があります。以下の単純なメソッドは、ビューのサブビューをループし、ビュー内のすべての UIScrollView の scrollsToTop 値をログに記録します。できれば、viewDidAppear メソッドで呼び出されることをお勧めします。

- (void)checkForScrollViewInView:(UIView *)view {
    for (UIView *subview in [view subviews]) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
        }
        if (subview.subviews.count > 0) {
            [self checkForScrollViewInView:subview];
        }
    }
}

これは単なるデバッグ コードです。UIScrollView サブクラスのそれぞれの scrollsToTop 値を見つけたら、1 つだけが YES に設定されていることを確認します。

于 2015-08-21T04:05:18.193 に答える