4

我试图在方法中旋转后读取 tableview 的 contentOffset

willRotateToInterfaceOrientation:持续时间:。我使用 UITableViewController 和 tableHeaderView 中的搜索栏创建了一个示例。

场景 1:给定设备处于纵向并且我隐藏了搜索栏然后我将设备旋转到横向之后我希望不会看到 UISearchbar 和 contentOffset 保持不变。

场景 2:给定设备处于横向状态并且我隐藏了搜索栏然后我将设备旋转到纵向之后我希望不会看到 UISearchbar 和 contentOffset 保持不变。

方案 1 按预期工作。场景 2 弹出 Searchbar 并且 contentoffset 为零

有人知道为什么 ContentOffset 为零吗?我希望它是 44(搜索栏的高度)。

有没有办法解决这个问题?你会怎么做?

//
//  ViewController.m
//  test
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    //is necessary to prevent showing searchbar
    dispatch_async(dispatch_get_main_queue(), ^{


        double y = self.tableView.contentOffset.y;

        self.tableView.contentInset = UIEdgeInsetsMake(-1*y, 0, 0, 0);

        NSLog(@"y %f",y);
        NSLog(@"Begin offset %@",NSStringFromCGPoint(self.tableView.contentOffset));
    });

}

- (void)viewDidAppear:(BOOL)animated{

    self.tableView.tableHeaderView = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44)];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...

    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

}

@end
4

2 回答 2

2

我想我知道问题出在哪里:

UITableView 具有默认的自动调整大小掩码。因此,在将设备从纵向旋转到横向之后,UITableView 变得越来越小(这不会改变偏移量)。如果用户现在转回纵向,则 UITableView 需要被拉伸并自动滚动到顶部。为了解决这个问题,我使用了一个变量来注册每个“用户滚动”,比如

  • scrollViewWillBeginDragging(注册)
  • scrollViewDidEndDecelerating(注销)
  • 在“scrollViewDidScroll”中我检查滚动是否来自用户(如果它来自用户保存偏移值)

最后在“willRotateToInterfaceOrientation”方法中,我将临时保存的偏移量设置为 UITableView 以使其保持在同一位置。

我希望会有更好的解决方案,因为我解决这个问题的方法有点棘手。

于 2012-11-12T09:52:26.300 回答
2

我今天遇到了类似的问题,我找到了解决方案。声明了一个维护 tableView 的 contentOffset 的实例变量。在 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 方法调用期间保留 contentOffset 值并将其应用于 - (void)viewWillLayoutSubviews 方法。我们需要重写这个方法。

- (void)willRotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation      duration:(NSTimeInterval)duration
{
    self.contentOffset = self.tableView.contentOffset;
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    self.tableView.contentOffset = self.contentOffset;
}

这解决了我的问题,没有任何令人耳目一新的问题。

于 2014-06-05T12:12:23.323 回答