2012-11-01 3 views
7

UIView의 서브 클래스를 만들 때 대개 내 모든 초기화 및 레이아웃 코드를 init 메서드에 배치합니다. 하지만 레이아웃 코드는 layoutSuviews을 재정 의하여 수행해야한다고 들었습니다. SO가 post인데, 각각이라는 메서드가 호출 될 때 을 설명하지만 실제로 사용하는 방법을 알고 싶습니다.UIView : layoutSubviews 대 initWithFrame

나는 현재이처럼 init 방법에 내 모든 코드를 넣어

:

MyLongView.m

- (id)initWithHorizontalPlates:(int)theNumberOfPlates 
{ 
    self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)]; 

    if (self) { 
     // Initialization code 
     _numberOfPlates = theNumberOfPlates; 

     UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame]; 
     [scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)]; 
     [self addSubview:scrollView]; 

     for(int i = 0; i < _numberOfPlates; i++){ 
      UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]]; 
      UIImageView *plateImage = [[UIImageView alloc] initWithImage:img]; 
      [scrollView addSubview:plateImage]; 
      plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2); 
     } 

    } 
    return self; 
} 

그것은 일반적인 작업입니다 : 설정, 뷰의 프레임을 설정 바르를 초기화하는 UIImages 초기화, UIImageViews에 배치, 그들을 밖으로 배치 할 수 있습니다.

제 질문은 : init 중 어느 것을 수행해야합니까? layoutSubviews?

답변

15

init는 필요한 데이터와 함께 모든 객체를 생성해야합니다. init에서 전달하는 프레임은 이상적으로 시작 위치에 있어야합니다.

그런 다음 layoutSubviews : 내에서 모든 요소의 프레임을 변경하여 이동해야하는 위치에 배치합니다. layoutSubviews에서 위치 및 크기 변경 만 alloc'ing 또는 init'ing이 이루어져야합니다.

4

autoresizingFlags 또는 autolayout을 사용하면 자동 완성이 완벽하게 작동하는 경우 일 수 있습니다. init을 사용하여 전체보기를 설정하십시오.

일반적으로 layoutSubviews에서 레이아웃 작업을 수행해야합니다. 레이아웃 프레임은 뷰 프레임의 모든 변경 사항과 레이아웃이 다시 필요한 다른 상황에서 호출되기 때문에 일반적으로 layoutSubviews에서 레이아웃 작업을 수행해야합니다. 때로는 init 내에서 마지막 뷰 프레임을 모르는 경우가 있기 때문에 위에서 설명한대로 유연해야하거나 layoutSubviews를 사용해야합니다. 최종 크기를 설정 한 후에 레이아웃을 수행해야하기 때문입니다.

WDUK에서 언급했듯이 모든 초기화 코드/객체 생성은 init 메소드 또는 다른 곳에서 수행해야하지만 은 아니고 layoutSubviews에서이되어야합니다.

+2

나는 그것을 더 아래로 밀 것이다. init이 아닌'viewDidLoad'에서 서브 뷰 객체를 생성하십시오. 뷰가 지연되어로드되므로 수퍼 뷰를 만들지 않을 경우 하위 뷰를 만들 필요가 없습니다. – Abizern

+9

우리는 여기서 ViewController가 아니라 View에 대해 이야기하고 있습니다. – calimarkus

관련 문제