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.