2013-01-24 30 views
4

我正在使用PPRevealSideViewController。我有兩個ViewController。中間的一個是SideSwipeTableViewController的子類,左邊的是UIViewController的子類,裏面有一個tableView。至少對於位於PPRevealSideViewController中間的TableView,PPRevealSideViewController和SideSwipeTableViewController的示例應用程序都支持UITableView的scrollsToTop屬性。但是,當我使用這兩個類時,scrollsToTop停止工作。scrollsToTop不起作用

我知道這是類似的問題,但我已經嘗試了一切,我看過的所有帖子,,谷歌給了我這個問題,但還是沒能解決這個問題。所以我決定在這裏問,我甚至沒有什麼想法,甚至做什麼,使滾動ToTop工作。

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

但是,它並不能幫助:

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此設置。

回答

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的全局鏈接。

+1

智力爲+1,極度冒險爲-1。 – user

7

滾動到頂部只能如果只有一個滾動視圖(或滾動視圖的任何子類。在你的情況下,它是表視圖)是可見的。

即使有多個滾動視圖可見,只有一個應該有這個屬性集,那麼只有它可以工作。

另外,如果委託在scrollViewShouldScrollToTop中返回NO,它將不起作用。

+0

代表返回YES;我只有兩個可見的scrollViews。我爲第一個設置了scroll_ToTop - YES和第二個NO。 – wzbozon

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; 
} 
+1

謝謝,雖然它不適用於我的情況。但使用遞歸的想法很有趣。 – wzbozon

+0

比你。您的方法幫助我在表格單元格中找到那些「已忘記」的文本視圖,從而防止表視圖成爲啓用了scrollToTop的唯一滾動視圖。 – parametr

0

我以爲是我在喬布斯的鬼魂詛咒,因爲我試圖從所有相關的問題,每一個可能的解決方案在這裏StackOverflow上,我不能讓我的scrollviews合作。

如果上述答案爲你 - 工作確保你沒有你的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方法,並且在重載調用像上面列出的@Dominic_Sander的遞歸滾動視圖檢查方法之後,雖然我沒有檢查過這個解決方案,因爲我完成了搞亂了這個問題。

0

我知道這是一個很古老的,但希望這可以幫助。繼該scrollsToTop不工作,如果超過一個UIScrollView的,或者它的子類的規則,已得到它設置爲YES(默認值),進行仔細的檢查可能是值得檢查誰實際上這種行爲搞亂。下面的簡單方法遍歷視圖的子視圖並記錄視圖中所有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值,只​​要確保只有一個設置爲YES。