2011-11-10 2 views
3

자동 크기 조정 마스크가 자동으로 수행하는 것과 반대의 작업을 시도하고 있습니다. 즉, 저는 뷰 계층 구조를 가지고 있으며 가장 깊은 서브 뷰 프레임의 변경 사항을 체인까지 올리므로 모든 서브 뷰가 더 새로운 (더 큰) 서브 뷰에 맞게 크기를 조정해야합니다.하위 뷰 크기 조정을 슈퍼 뷰 크기 조정에 전파하려면 어떻게해야합니까?

특히, 나는 테이블과 다른 이미지를 포함하는 다른 뷰를 포함하는 컨테이너로 서브 뷰를 가진 스크롤 뷰를 가지고 있습니다. 과 같이 :

enter image description here

그리고이 일련의 사건입니다 :

A)

한 가장 안쪽 테이블, 2 개 행이 경우 아래 스트레칭해야 할 수도의 이름 사람이 너무 깁니다 (셀 높이가 가변적이며 런타임에 heightForCellAtIndexPath에서 계산 됨).

2이 경우 테이블의 셀이 뷰를 오버플로하는 일이 없도록이 테이블과 이미지에 대한 컨테이너보기의 확장을 트리거해야합니다.

3 그렇다면이 컨테이너보기 아래에있는 다른 테이블은 조금 겹쳐서 표시되어 겹치지 않는지 확인해야합니다. 단계 1,2가 일어나지 않더라도 체인이 여기서 시작될 수 있습니다. 더 긴 텍스트를 수용하기 위해이 테이블의 3 행이 늘어나는 경우이 경우입니다.

4 위의 결과가 길어지면 가장 바깥 쪽 컨테이너보기도 늘어납니다.

5 마지막으로,이 외부 컨테이너보기가 늘어난 경우 루트보기에서 contentSize 속성을 변경해야 새로운 큰보기가 적합 해지고 장치 화면보다 큰 경우 완전히 스크롤 할 수 있습니다.

첫 번째 문제는 코드의 어떤 지점에서 셀을 레이아웃하고 마지막 프레임을 계산했는지를 아는 것입니다. 마지막 프레임이 언제 알 수 있다면 view.frame 변경에 대한 KVO 알림을 이러한 모든 뷰를 관리하는 단일보기 컨트롤러로 보낼 수 있습니다. 그러나 컨트롤러는 수동으로 모든 하위 뷰 프레임의 크기를 조정해야합니다. 이 방법을 시도했지만 프레임이 정확하지 않은 것 같습니다. 내가 고려하지 않은 타이밍 문제가 있을지 궁금하다.

- (void)viewDidLoad 
{ 
    ... 

    [self addObserver:self forKeyPath:@"attendeeContentView.frame" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqualToString:@"attendeeContentView.frame"]) 
    { 
    CGRect newFrame = [[change objectForKey:NSKeyValueChangeOldKey] CGRectValue]; 
    UIScrollView *scrollView = (UIScrollView*)self.view; 
    scrollView.contentSize = CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, newFrame.size.height + newFrame.origin.y); 
    NSLog(@"\n new contentSize: %f", newFrame.size.height + newFrame.origin.y); 
    } 
} 

을하지만이 체인 만 마지막 링크입니다 :

이것은 예를 들어 작동합니다. 그것은 모든 세포에 맞게 확장되는 가장 안쪽 테이블로 시작됩니다 ...

아이디어가 있으십니까?

+0

하고 무엇을 끝낼습니까? – huggie

답변

0
당신은 단지 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath의 마지막 호출을 확인할 수 있습니다

if (indexPath.row == (NumberOfCells - 1)) { 
     // update your views (preferably call it after a slight delay) 
} 
관련 문제