[iphone] UITableView의 tableHeaderView 크기를 조정하는 방법은 무엇입니까?

tableHeaderView 크기를 조정하는 데 문제가 있습니다. 간단하지 않습니다.

1) UITableView 및 UIView (100 x 320 px)를 만듭니다.

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의 크기를 어떻게 조정합니까 ??

누구든지 이것을 할 수 있습니까?

감사

iMe



답변

참고 : 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];


답변

이 답변은 오래되었으며 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를 스크롤하려고하면 머리글보기의 크기가 조정되지 않은 것처럼 스크롤이 애니메이션됩니다 (애니메이션이 빨리).


답변

변경 사항을 조건부로 애니메이션하려면 다음을 수행 할 수 있습니다.

- (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];
    }
}

애니메이션은 두 개로 접혀 있습니다.

  1. 아래에있는 셀의 애니메이션 tableHeaderView. 이것은 beginUpdates및 사용하여 수행됩니다.endUpdates
  2. 실제 헤더보기의 애니메이션입니다. 이것은 UIView애니메이션 블록을 사용하여 수행됩니다 .

이 두 애니메이션을 동기화하려면을 animationCurve로 설정 UIViewAnimationCurveEaseInOut하고 기간을 로 설정해야 합니다 0.3. 이는 UITableView가 애니메이션에 사용하는 것 같습니다.

최신 정보

나는 이것을하는 gihub에 Xcode 프로젝트를 만들었다. besi / ios-quickiesResizeTableHeaderViewAnimated 에서 프로젝트 확인

스크린 샷


답변

myHeaderView의 높이를 다음과 같이 설정하면 작동해야한다고 생각합니다.

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

self.tableView.tableHeaderView = myHeaderView;


답변

iOS 7까지 위의 @garrettmoon 솔루션을 사용했습니다.
다음은 @garrettmoon을 기반으로 한 업데이트 된 솔루션입니다.

- (void)adjustTableHeaderHeight:(NSUInteger)newHeight animated:(BOOL)animated {

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:[CATransaction animationDuration]];
    [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);

    [(UITableView *)self.superview setTableHeaderView:self];

    [UIView commitAnimations];
}

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


답변

이것은 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];
}];


답변

tableHeaderView의 setter 때문입니다.

tableHeaderView를 설정하기 전에 UIView 높이를 설정해야합니다. (애플이이 프레임 워크를 오픈 소스한다면 훨씬 쉬울 것입니다 …)