iOS 에서 UIView 의 layoutSubviews 하위 보기 레이아웃 방법 을 자세히 설명 합 니 다.

5871 단어 iOSUIView
콘 셉 트
UIView 에 layout Subviews 방법 이 있 습 니 다.

- (void)layoutSubviews;    // override point. called by layoutIfNeeded automatically. As of iOS 6.0, when constraints-based layout is used the base implementation applies the constraints-based layout, otherwise it does nothing.
layoutSubviews 방법의 구체 적 인 역할
layoutSubviews 는 subviews 를 다시 배치 합 니 다.예 를 들 어 우리 가 하위 보기 의 위 치 를 업데이트 하고 싶 을 때 layoutSubviews 방법 을 호출 하면 하위 보기 의 재 구성 도 실현 할 수 있 습 니 다.
layoutSubviews 는 기본적으로 아무것도 하지 않 습 니 다.사용 할 때 천둥 에서 다시 써 야 합 니 다.
실례
아이 패드 의 가로 세로 화면 이 다 르 기 때문에 좋 은 응용,가로 세로 화면의 페이지 레이아웃 도 다르다.그렇다면 가로 세로 화면의 전체적인 해결 방안 이 필요 하 다.먼저 가로 세로 화면 레이아웃 이 다른 화면 을 보 세 요.
아래 두 장의 그림 은 같은 인터페이스의 가로 세로 판 캡 처 이다.가로 세로 판 에 표 시 된 내용 은 같 지만 인터페이스 레이아웃 은 다르다 는 것 을 알 수 있다.위 레이아웃 을 구현 하려 면 주로 UIView 의 layoutSubviews 방법 을 사용 합 니 다.UIView 가 자동 으로 화면 에 맞 게 설정 되 었 을 때 사용자 가 장 치 를 회전 할 때 layoutSubviews 방법 을 사용 합 니 다.이 방법 을 다시 쓰 고 사용자 화면의 방향 을 판단 합 니 다.각 공간의 위 치 를 조정 하면 됩 니 다.
201642791446629.jpg (360×480)
201642791505056.jpg (640×480)
다음은 상기 인터페이스 를 실현 하 는 가장 간단 한 원형 이다.
먼저 분석 하면 왼쪽 은 그림 이 고 오른쪽 은 그림 에 문 자 를 넣 은 보기 임 을 알 수 있다.왼쪽 보기 오른쪽 은 그림 에 한 자 를 더 한 사례 다.
사례 의 캡 처 는 다음 과 같다.
201642791524044.png (372×480)
201642791543249.png (549×423)
그 중에서 오른쪽 에 있 는 문자 와 녹색 부분 은 하나의 보기 로 봉 해 져 있다.
전체 레이아웃 은 제 가 메 인 보기에 ContentView 보 기 를 추 가 했 고 ContentView 보기에 ArticleView 보 기 를 추 가 했 습 니 다.
그 중에서 ArticleView 와 ContentView 의 xib 파일 이 모두 열 렸 습 니 다.
201642791604398.png (212×64)
ContentView 에서 layoutSubviews 방법 을 다시 쓴 다음 stausbar 방향 에 따라 현재 보기 의 가로 세로 화면 을 판단 합 니 다.구체 적 인 코드:

-(void)layoutSubviews{
[super layoutSubviews];
UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation];
if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) {
//
[self setVerticalFrame];
}else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) {
//
[self setHorizontalFrame];
}
}

-(void)setVerticalFrame
{
NSLog(@" ");
[titleLable setFrame:CGRectMake(283, 0, 239, 83)];
[leftView setFrame:CGRectMake(38, 102, 384, 272)];
[rightView setFrame:CGRectMake(450, 102, 282, 198)];
}

-(void)setHorizontalFrame
{
NSLog(@" ");
[titleLable setFrame:CGRectMake(183, 0, 239, 83)];
[leftView setFrame:CGRectMake(168, 122, 384, 272)];
[rightView setFrame:CGRectMake(650, 122, 282, 198)];
}

구체 적 인 가로 세로 화면 방법 에 서 는 각 구성 요소 의 좌 표를 새로 설정 하면 된다.
다음은 ContentView 에 ArticleView 보 기 를 추가 합 니 다.

-(id)initWithCoder:(NSCoder *)aDecoder
{
if ((self = [super initWithCoder:aDecoder])) {

NSArray *arrayContentView =[[NSBundle mainBundle] loadNibNamed:@"ArticleView" owner:self options:nil];
rightView=[arrayContentView objectAtIndex:0];
[self addSubview:rightView];
}
return self;
}

xib 를 사용 하기 때문에 initWithCoder 로 초기 화 하 는 방법 입 니 다.여기에 새로운 보 기 를 추가 합 니 다.
마찬가지 로 ArticleView 에 가로 세로 화면의 해당 공간의 좌 표를 설정 하면 된다.

-(void)layoutSubviews{
[super layoutSubviews];
UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation];
CGRect rect=self.frame;
rect.size.width=282;
rect.size.height=198;
[self setFrame:rect];
if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) {
//
[self setVerticalFrame];
}else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) {
//
[self setHorizontalFrame];
}
}

-(void)setVerticalFrame
{
NSLog(@" ");
[contentView setFrame:CGRectMake(12, 6, 250, 125)];
[textLable setFrame:CGRectMake(50, 139, 182, 39)];
}

-(void)setHorizontalFrame
{
NSLog(@" ");
[contentView setFrame:CGRectMake(12, 6, 106, 158)];
[textLable setFrame:CGRectMake(135, 11, 147, 39)];
}

총결산
layoutSubviews 아래 상황 이 호출 됩 니 다:
애플 공식 문 서 는 layoutSubviews 를 직접 호출 하여 하위 보 기 를 재 구성 할 수 없다 고 강조 했다.그럼,layoutSubviews 는 어떤 상황 에서 호출 됩 니까?바 이 두 검색 을 통 해 다음 과 같은 몇 가지 상황 을 알 수 있 습 니 다.layout Subviews 가 호출 됩 니 다.
  • setLayoutSubviews 를 직접 호출 합 니 다.(이것 은 위의 애플 공식 문서 에 설명 되 어 있다)
  • 4.567917.addSubview 때..4.567917.view 의 frame 이 바 뀌 었 을 때..
  • UIScrollView 를 미 끄 러 뜨 릴 때..
  • 화면 을 돌리 면 부모 UIView 의 layoutSubviews 이벤트 가 발생 합 니 다
  • UIView 크기 를 변경 할 때 도 부모 UIView 의 layoutSubviews 이 벤트 를 촉발 합 니 다
  • 나 는 간단하게 테스트 를 해 보 았 는데,위 에 서 는 기본적으로 모두 호출 될 것 이다.주의:
    view 의 fram 값 이 0 일 때'addSubview'도'layoutSubviews'를 호출 하지 않 습 니 다.
    layoutSubviews 방법 은 천둥 보 기 를 배치 할 때 매우 편리 합 니 다.레이아웃 Subviews 의 호출 메커니즘 을 깊이 이해 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기