2012-08-27 5 views
8

내 의견 중 하나에서 sizeToFit으로 전화하면 iOS 프레임 워크가 먼저 sizeThatFits을 호출 한 다음 layoutSubviews을 호출하는 것으로 나타났습니다. 내 sizeThatFits의 계산이 내 layoutSubviews의 결과에 따라 다르므로 문제가됩니다. 다음 예제에서는 하위 뷰가 layoutSubviews으로 조정되고이 하위 뷰의 높이가 sizeThatFits에 사용됩니다. 현재 내 코드가 작동하지 않아 주문이 취소되었습니다. 내보기 컨트롤러의 viewDidLoad에서sizeThatFits 전에 layoutSubviews를 호출하는 방법?

:

UIView* header = [[MyHeader alloc] init]; 
[header sizeToFit]; 
self.tableView.tableHeaderView = header; 
[header release]; 

내보기에서 :

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self.subView sizeToFit]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 
+0

이 문제를 해결 했습니까? –

+0

첫 번째 코드에서'[header sizeToFit]'를 호출하면 아무 것도하지 않고'MyHeader'의'sizeThatFits :'는 덮어 쓰지 않습니다 : >이 메소드의 기본 구현은 뷰의 경계 사각형의 크기 부분을 반환합니다. – Rivera

답변

0

당신은 단지 -layoutSubviews 방법 대신 -sizeThatFits: 방법에 서브 뷰의 프레임을 변경할 수 없습니다?

1

을보기 위해 layoutIfNeeded을 호출 해 보았습니까? 오해의 소지가있는 이름에도 불구하고, 이것은 즉시 layoutSubviews을 방아쇠를 당기는 방법입니다. sizeToFit 또는 sizeThatFits 앞에 전화 해보십시오.

6

어떤 순서로 호출하든 관계없이 항상 올바른 작업 (tm)을 원할 수 있습니다. 이를 달성하기 위해 뷰의 원하는 높이와 서브 뷰를 별도의 메서드로 계산하는 코드를 배치하는 것이 좋습니다. 이 라인을 따라 뭔가 :

- (void)updateSubviewDimensions 
{ 
    [self.subview sizeToFit]; 
    // possibly much more code 
} 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self updateSubviewDimensions]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    [self updateSubviewDimensions]; 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

이렇게하면 sizeToFit를 호출하기 전에 특정 메소드를 호출 기억에 의존하지 않는,하지만보기는 항상 당신이 원하는 것을 할 것입니다. 또한 몇 달 후 (또는 다른 개발자가 살펴보기 위해) 코드를 볼 때 코드가 부서지기 쉽고 이해하기 쉽습니다.

+0

TL; DR :'updateConstraints'를 구현하고'updateSubviewDimensions'를 호출하십시오. Verbose : 완전한 대답을위한 시간이 없지만 여기에 적절한 해결책은 updateConstraints를 구현하는 것입니다. iOS 8에서 테스트하기.3, systemLayoutConstraintsFittingSize의 기본 UIView 구현은 궁극적으로 updateConstraints에 대한 호출을 호출합니다. 이것은 AL 시스템에 실제 크기를 알 필요없이 크기를 결정하는 데 필요한 모든 것을 제공합니다. –

2

sizeThatFits:의 레이아웃이 정확해야한다면 레이아웃을 강제 실행해야합니다 (아래 코드 참조).하지만 레이아웃이 "크기"를 고려하지 않았기 때문에 이것이 잘못 설계된 것 같습니다.

- (CGSize) sizeThatFits:(CGSize)size { 

    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 

    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

더 나은 방법이보기의 필요한 크기를 결정하기 위해 다음, 당신의 파단에 대한 자동 레이아웃을 사용 systemLayoutSizeFittingSize:을 사용할 수 있습니다 (대 sizeThatFits:)

당신이 할 수 없거나하지 않으려는 경우 자동 레이아웃을 사용하려면 실제 레이아웃과 레이아웃 계산을 위해 별도의 코드 경로를 고려해야합니다.

1

여기서 문제는 layoutSubviews가 호출 될 때까지 하위 뷰에 차원이 없음을 의미합니다. 이는 사용자 정의 테이블 뷰 셀에서와 동일합니다.

이 문제를 해결하려면 논리를 변경하거나 자동 작업에 의존하지 않고 명시적인 차원을 얻으려면 수학을 직접 수행해야합니다.

관련 문제