답변:
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]
이 뷰를 맨 위로 가져 오지만 뷰가 계층 구조의 모든 형제 자매 인 경우에만 해당됩니다.
zPosition
뷰 레이어 의 속성 ( CALayer
객체)을 사용하여 뷰의 z- 색인을 변경할 수 있습니다.
theView.layer.zPosition = 1;
Viktor Nordling 은 다음과 같이 덧붙였습니다. "큰 값이 맨 위에 있습니다. 음수 값을 포함하여 원하는 값을 사용할 수 있습니다." 기본값은 0입니다.
레이어에 액세스하려면 QuartzCore 프레임 워크를 가져와야합니다. 구현 파일 맨 위에이 코드 줄을 추가하십시오.
#import "QuartzCore/QuartzCore.h"
zPosition
작품 을 만들려면 뷰의 수퍼 뷰가 같아야 합니까?
IB와 스위프트
노란색이 슈퍼 뷰이고 빨간색, 녹색 및 파란색이 노란색의 하위 뷰인 유동 레이아웃을 가정하면,
목표는 하위 뷰 (녹색이라고합시다)를 맨 위로 이동하는 것입니다.
Interface Builder에서 표시 할보기를 Documents Outline의 목록 맨 위로 드래그하면됩니다.
또는보기를 선택한 다음 메뉴에서 편집기> 정렬> 맨 앞으로 보내기로 이동할 수 있습니다.
프로그래밍 방식으로이 작업을 수행하는 몇 가지 방법이 있습니다.
방법 1
yellowView.bringSubviewToFront(greenView)
이 방법은 위의 IB 답변과 프로그래밍 방식으로 동일합니다.
하위보기가 서로 형제 인 경우에만 작동합니다.
하위보기의 배열은에 포함되어 yellowView.subviews
있습니다. 여기 에서 인덱스 를 에서로 bringSubviewToFront
이동합니다 . 이것은으로 볼 수 있습니다greenView
0
2
print(yellowView.subviews.indexOf(greenView))
방법 2
greenView.layer.zPosition = 1
0
다른 모든보기에 대한 것이므로 결과는 greenView
맨 위에있는 것입니다. 그러나 여전히 배열의 인덱스 0
에 남아 있습니다 yellowView.subviews
. 탭 이벤트와 같은 항목이 여전히 가장 높은 색인 번호를 가진보기로 이동하기 때문에 예기치 않은 결과가 발생할 수 있습니다. 따라서 위의 방법 1을 사용하는 것이 좋습니다.zPosition
설정 될 수있다 CGFloat.greatestFiniteMagnitude
( CGFloat(FLT_MAX)
이 상위에 있는지 확인하기 위해 스위프트의 이전 버전에서).cocos2d를 사용하는 경우 [parentView bringSubviewToFront : view]에 문제가있을 수 있습니다. 적어도 저에게는 효과가 없었습니다. 내가 원하는 뷰를 전면으로 가져 오는 대신 다른 뷰를 다시 보내서 트릭을 수행했습니다.
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)];
iOS에서 zPosition을 사용할 수 있습니다
salonDetailView 라는 뷰가 있다면
:@IBOutlet weak var salonDetailView: UIView!
GMSMapView에 대한 UIView가 있습니다
.@IBOutlet weak var mapViewUI: GMSMapView!
보기 표시하려면 salonDetailView 의 상단 mapViewUI을
아래와 같이 zPosition을 사용하십시오.
salonDetailView.layer.zPosition = 1