4

メソッドで回転後のテーブルビューのcontentOffsetを読み込もうとしていた

willRotateToInterfaceOrientation:duration:. tableHeaderView に検索バーがある UITableViewController を使用してサンプルを作成しました。

シナリオ 1: デバイスが縦向きの場合、検索バーを非表示にしてから、デバイスを横向きに回転させます。その後、UISearchbar と contentOffset が同じままであるとは思われません。

シナリオ 2: デバイスが横向きの場合、検索バーを非表示にしてから、デバイスを縦向きに回転させます。その後、UISearchbar と contentOffset が同じままになることはないと予想されます。

シナリオ 1 は期待どおりに機能しています。シナリオ 2 は検索バーをポップアウトし、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 に答える