103

tableHeaderView のサイズ変更に問題があります。それは単純に機能しません。

1) UITableView と UIView (100 x 320 ピクセル) を作成します。

2) UIView を UITableView の tableHeaderView として設定します。

3) ビルドして実行します。全て大丈夫。

ここで、tableHeaderView のサイズを変更したいので、viewDidLoad に次のコードを追加します。

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

tableHeaderView の高さは 200 で表示されるはずですが、100 で表示されます。

私が書く場合:

self.tableView.autoresizesSubviews = YES;


CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;


self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

それから、私が望むように、高さ 200 から始めます。しかし、実行時に変更できるようにしたいです。

私もこれを試しましたが、成功しませんでした:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];

ここでのポイントは次のとおりです。実行時に tableHeaderView のサイズを変更するにはどうすればよいですか???

誰でもこれを行うことができますか?

ありがとう

アイミー

4

19 に答える 19

180

参考:tableHeaderViewを変更して再設定することで、これを機能させることができました。この場合、UIWebViewサブビューの読み込みが完了したときにtableHeaderViewのサイズを調整しています。

[webView sizeToFit];
CGRect newFrame = headerView.frame;
newFrame.size.height = newFrame.size.height + webView.frame.size.height;
headerView.frame = newFrame;
[self.tableView setTableHeaderView:headerView];
于 2009-02-09T01:01:11.097 に答える
12

この回答は古く、明らかに iOS 7 以降では機能しません。

私は同じ問題に遭遇し、変更をアニメーション化したかったので、ヘッダー ビューの UIView のサブクラスを作成し、これらのメソッドを追加しました。

- (void)adjustTableHeaderHeight:(NSUInteger)newHeight{
    NSUInteger oldHeight = self.frame.size.height;
    NSInteger originChange = oldHeight - newHeight;

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.frame = CGRectMake(self.frame.origin.x, 
                        self.frame.origin.y, 
                        self.frame.size.width, 
                        newHeight);

    for (UIView *view in [(UITableView *)self.superview subviews]) {
        if ([view isKindOfClass:[self class]]) {
            continue;
        }
        view.frame = CGRectMake(view.frame.origin.x, 
                            view.frame.origin.y - originChange, 
                            view.frame.size.width, 
                            view.frame.size.height);
    }

    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    [(UITableView *)self.superview setTableHeaderView:self];
}

これは基本的に、呼び出し元のクラスと同じクラス タイプではない UITableView のすべてのサブビューをアニメーション化します。アニメーションの最後に、スーパービュー (UITableView) で setTableHeaderView を呼び出します。これがないと、ユーザーが次にスクロールしたときに UITableView のコンテンツが元に戻ります。私がこれまでに見つけた唯一の制限は、アニメーションの実行中にユーザーが UITableView をスクロールしようとすると、ヘッダー ビューのサイズが変更されていないかのようにスクロールがアニメーション化されることです (アニメーションが素早い)。

于 2010-02-01T18:42:50.390 に答える
11

条件付きで変更をアニメーション化する場合は、次の操作を実行できます。

- (void) showHeader:(BOOL)show animated:(BOOL)animated{

    CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0);
    CGRect newFrame = show?self.initialFrame:closedFrame;

    if(animated){
        // The UIView animation block handles the animation of our header view
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        // beginUpdates and endUpdates trigger the animation of our cells
        [self.tableView beginUpdates];
    }

    self.headerView.frame = newFrame;
    [self.tableView setTableHeaderView:self.headerView];

    if(animated){
        [self.tableView endUpdates];
        [UIView commitAnimations];
    }
}

アニメーションは2つに分かれていることに注意してください。

  1. の下のセルのアニメーションtableHeaderView。これはbeginUpdatesendUpdates
  2. 実際のヘッダービューのアニメーション。これは、UIViewアニメーションブロックを使用して行われます。

これらの2つのアニメーションを同期するにanimationCurveは、をに設定しUIViewAnimationCurveEaseInOut、期間をに設定する0.3必要があります。これは、UITableViewがアニメーションに使用するもののようです。

アップデート

これを行うXcodeプロジェクトをgihubで作成しました。besi/ios-quickiesResizeTableHeaderViewAnimatedでプロジェクトをチェックしてください

スクリーンショット

于 2013-03-14T17:30:20.400 に答える
10

myHeaderView の高さを次のように設定するだけでうまくいくと思います:

CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;

self.tableView.tableHeaderView = myHeaderView;
于 2009-01-07T03:40:14.737 に答える
5

これは、iOS 7 および 8 で機能しました。このコードは、テーブル ビュー コントローラーで実行されています。

[UIView animateWithDuration:0.3 animations:^{
    CGRect oldFrame = self.headerView.frame;
    self.headerView.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, oldFrame.size.width, newHeight);
    [self.tableView setTableHeaderView:self.headerView];
}];
于 2014-11-27T00:29:27.097 に答える
4

それは、tableHeaderView のセッターのためです。

tableHeaderView を設定する前に、UIView の高さを設定する必要があります。(Apple がこのフレームワークをオープン ソース化すれば、はるかに簡単になります...)

于 2010-09-19T21:08:37.357 に答える
0

UITableViewのサイズ変更ヘッダー - スコープバー付きのUISearchBar

テーブルのヘッダーとしてaUITableViewUISearchBar必要だったので、このような階層があります

UITableView
  |
  |--> UIView
  |     |--> UISearchBar
  |
  |--> UITableViewCells

UISearchBarDelegate メソッド

別の場所で述べられているように、変更後に TableViewHeader を設定しないと何も起こりません。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsScopeBar = YES;
    [UIView animateWithDuration:0.2f animations:^{
        [searchBar sizeToFit];
        CGFloat height = CGRectGetHeight(searchBar.frame);

        CGRect frame = self.tableView.tableHeaderView.frame;
        frame.size.height = height;
        self.tableHeaderView.frame = frame;
        self.tableView.tableHeaderView = self.tableHeaderView;
    }];

    [searchBar setShowsCancelButton:YES animated:YES];
    return YES;
}

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    searchBar.showsScopeBar = NO;
    [UIView animateWithDuration:0.f animations:^{
        [searchBar sizeToFit];

        CGFloat height = CGRectGetHeight(searchBar.frame);

        CGRect frame = self.tableView.tableHeaderView.frame;
        frame.size.height = height;
        self.tableHeaderView.frame = frame;
        self.tableView.tableHeaderView = self.tableHeaderView;
    }];

    [searchBar setShowsCancelButton:NO animated:YES];
    return YES;
}
于 2015-06-06T12:23:59.827 に答える
0

UIView の initWithFrame イニシャライザが、渡した rect を適切に尊重しないことがわかりました。したがって、完全に機能する次のことを行いました。

 - (id)initWithFrame:(CGRect)aRect {

    CGRect frame = [[UIScreen mainScreen] applicationFrame];

    if ((self = [super initWithFrame:CGRectZero])) {

        // Ugly initialization behavior - initWithFrame will not properly honor the frame we pass
        self.frame = CGRectMake(0, 0, frame.size.width, 200);

        // ...
    }
}

これの利点は、ビュー コードにうまくカプセル化されることです。

于 2010-12-05T16:34:56.333 に答える
-3

[self.tableView reloadData]高さを変えてみまし たか?

于 2008-12-05T01:11:23.060 に答える