iPhone UIView z 인덱스를 설정하는 방법?


252

한 뷰를 다른 뷰 위로 옮기고 싶습니다.보기의 z 인덱스를 어떻게 알 수 있습니까? 위로 이동하는 방법은 무엇입니까?

답변:


279

UIView형제는 감독에 추가되는 순서대로 쌓입니다. UIView계층 구조 방법과 속성보기 순서를 관리 할 수있다. UIView.h에서 :

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

형제보기는 subviews배열 에서 앞뒤로 정렬됩니다 . 따라서 최상위 뷰는 다음과 같습니다.

[parentView.subviews lastObject];

하단보기는 다음과 같습니다.

[parentView.subviews objectAtIndex:0];

Kolin Krewinkel이 말했듯 [parentView bringSubviewToFront:view]이 뷰를 맨 위로 가져 오지만 뷰가 계층 구조의 모든 형제 자매 인 경우에만 해당됩니다.


329

zPosition뷰 레이어 의 속성 ( CALayer객체)을 사용하여 뷰의 z- 색인을 변경할 수 있습니다.

theView.layer.zPosition = 1;

Viktor Nordling 은 다음과 같이 덧붙였습니다. "큰 값이 맨 위에 있습니다. 음수 값을 포함하여 원하는 값을 사용할 수 있습니다." 기본값은 0입니다.

레이어에 액세스하려면 QuartzCore 프레임 워크를 가져와야합니다. 구현 파일 맨 위에이 코드 줄을 추가하십시오.

#import "QuartzCore/QuartzCore.h"

7
도우미로서 큰 가치는 "정상"입니다. 음수 값을 포함하여 원하는 값을 사용할 수 있습니다.
— Viktor Nordling

12
이 솔루션은 항상보기를 원할 때 더 좋습니다. 그냥 MAXFLOAT에 zPosition을 설정
— 무하마드 하산 나스 르

27
방금 레이어의 zPosition과 UIView의 입력 핸들러가 두 개의 다른 Z 순서에 있다는 것을 알게되었습니다. 클릭이 "통과"할 때 정말 이상합니다.
— Stephen J

zPosition작품 을 만들려면 뷰의 수퍼 뷰가 같아야 합니까?
— Hlung

3
보기가 상단에 있어도 클릭은 아래의 객체로 이동합니다. 이것은 버그로 간주되어야합니다. 아래에서 발생하는 모든 뷰의 사용자 상호 작용을 명시 적으로 비활성화하지 않고도이 문제를 피할 수있는 일반적인 방법을 찾으려고합니다.
— Bruce Patin

103

IB와 스위프트

노란색이 슈퍼 뷰이고 빨간색, 녹색 및 파란색이 노란색의 하위 뷰인 유동 레이아웃을 가정하면,

보기-상단에 빨간색보기

목표는 하위 뷰 (녹색이라고합시다)를 맨 위로 이동하는 것입니다.

조회수-상단에 녹색보기

인터페이스 빌더에서

Interface Builder에서 표시 할보기를 Documents Outline의 목록 맨 위로 드래그하면됩니다.

Interface Builder의 뷰 순서

또는보기를 선택한 다음 메뉴에서 편집기> 정렬> 맨 앞으로 보내기로 이동할 수 있습니다.

스위프트에서

프로그래밍 방식으로이 작업을 수행하는 몇 가지 방법이 있습니다.

방법 1

yellowView.bringSubviewToFront(greenView)
  • 이 방법은 위의 IB 답변과 프로그래밍 방식으로 동일합니다.

  • 하위보기가 서로 형제 인 경우에만 작동합니다.

  • 하위보기의 배열은에 포함되어 yellowView.subviews있습니다. 여기 에서 인덱스 를 에서로 bringSubviewToFront이동합니다 . 이것은으로 볼 수 있습니다greenView02

      print(yellowView.subviews.indexOf(greenView))

방법 2

greenView.layer.zPosition = 1
  • 이 방법은 레이어의 3D 위치를 z 축에서 더 높이 (사용자에 더 가깝게) 이동시킵니다. 기본값은 0다른 모든보기에 대한 것이므로 결과는 greenView맨 위에있는 것입니다. 그러나 여전히 배열의 인덱스 0에 남아 있습니다 yellowView.subviews. 탭 이벤트와 같은 항목이 여전히 가장 높은 색인 번호를 가진보기로 이동하기 때문에 예기치 않은 결과가 발생할 수 있습니다. 따라서 위의 방법 1을 사용하는 것이 좋습니다.
  • 이 zPosition설정 될 수있다 CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)이 상위에 있는지 확인하기 위해 스위프트의 이전 버전에서).

이것에 감사합니다 ... 나는 이것을 알아 내려고 노력하는 데 8 시간을 보냈습니다. yellowView.bringSubviewToFront (greenView)가 완벽하게 작동했습니다.
— MizAkita

흥미롭게도 컨테이너 뷰 는 이것을 존중하지 않습니다! 코드에서 수동으로 이동해야합니다.
— Fattie


19

XCode의 Interface Builder를 통해이 작업을 수행하려면 Editor-> Arrangement에서 메뉴 옵션을 사용할 수 있습니다. 여기에는 "앞으로 보내기", "뒤로 보내기"등이 있습니다.


정렬 옵션을 비활성화하면 어떻게됩니까?
— mr5

9

보기에서 당신은 정상에 가져오고 싶습니다 ... (신속하게)

superview?.bringSubviewToFront(self)

btnDOWN.superview? .bringSubview (toFront : btnDOWN)
— Criss

4

cocos2d를 사용하는 경우 [parentView bringSubviewToFront : view]에 문제가있을 수 있습니다. 적어도 저에게는 효과가 없었습니다. 내가 원하는 뷰를 전면으로 가져 오는 대신 다른 뷰를 다시 보내서 트릭을 수행했습니다.

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

2

iOS에서 zPosition을 사용할 수 있습니다

salonDetailView 라는 뷰가 있다면 :@IBOutlet weak var salonDetailView: UIView!

내 경우에는 이미지를 참조하십시오

GMSMapView에 대한 UIView가 있습니다 .@IBOutlet weak var mapViewUI: GMSMapView!

보기 표시하려면 salonDetailView 의 상단 mapViewUI을

아래와 같이 zPosition을 사용하십시오.

salonDetailView.layer.zPosition = 1

OP가 쉽게 얻을 수 있도록 여기에 직접 사진과 코드를 게시하십시오.
— skratchi.at

초보자로서 StackOverflow는 미안하게 할 수 없습니다. 당신은 문제 이미지를 확인할 수 있습니다 i.stack.imgur.com/d9Cx3.png
— abhijith k

0

아니면 이것을 사용하십시오

- (void)insertSubview:(UIView *)view belowSubview:(UIView*)siblingSubview;

에 따라 여기에

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.