항법 컨트롤러의 투명 모달 뷰
내비게이션 컨트롤러 위에 투명 모달 보기를 만들려고 합니다.이것이 가능한지 아는 사람이 있습니까?
모달 보기는 위에서 누르는 보기뿐만 아니라 탐색 컨트롤러의 탐색 모음도 포함합니다.그러나 -presentModalViewController:animated: 접근 방식을 사용하는 경우 애니메이션이 완료되면 가려진 보기가 실제로 사라지므로 모달 보기의 투명성이 무의미해집니다.루트 뷰 컨트롤러에서 -viewWillDisparen: 및 -viewDidDisparen: 메서드를 구현하여 이를 확인할 수 있습니다.
다음과 같이 모달 뷰를 뷰 계층에 직접 추가할 수 있습니다.
UIView *modalView =
[[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
modalView.opaque = NO;
modalView.backgroundColor =
[[UIColor blackColor] colorWithAlphaComponent:0.5f];
UILabel *label = [[[UILabel alloc] init] autorelease];
label.text = @"Modal View";
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
[label sizeToFit];
[label setCenter:CGPointMake(modalView.frame.size.width / 2,
modalView.frame.size.height / 2)];
[modalView addSubview:label];
[self.view addSubview:modalView];
이와 같이 모달 뷰를 루트 뷰에 하위 뷰로 추가하면 탐색 모음이 실제로 포함되지 않지만 탐색 모음 아래의 전체 뷰가 포함됩니다.modalView 초기화에 사용된 프레임의 원점을 가지고 장난을 치려고 했지만 음수 값으로 인해 표시되지 않습니다.상태 표시줄을 제외한 전체 화면을 포함하는 가장 좋은 방법은 창 자체의 하위 보기로 modalView를 추가하는 것입니다.
TransparentModalViewAppDelegate *delegate = (TransparentModalViewAppDelegate *)[UIApplication sharedApplication].delegate;
[delegate.window addSubview:modalView];
가장 쉬운 방법은 NavigationController의 ModalPresentationStyle 속성을 사용하는 것입니다(단, 직접 애니메이션을 만들어야 합니다).
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalViewController animated:NO];
modalViewController.view.alpha = 0;
[UIView animateWithDuration:0.5 animations:^{
modalViewController.view.alpha = 1;
}];
창 또는 루트 보기의 다른 모든 하위 보기 위에 있는 "OverlayViewController"를 설정하여 이 작업을 가장 쉽게 수행할 수 있습니다.앱 대리자 또는 루트 뷰 컨트롤러에서 이를 설정하고 OverlayView 컨트롤러를 싱글톤으로 만들어 코드 또는 뷰 컨트롤러 계층의 모든 위치에서 액세스할 수 있도록 합니다.그런 다음 필요할 때마다 메소드를 호출하여 모달 보기를 표시하고 활동 표시기 등을 표시할 수 있으며, 메소드는 모든 탭 모음 또는 탐색 컨트롤러를 포함할 수 있습니다.
루트 뷰 컨트롤러의 샘플 코드:
- (void)viewDidLoad {
OverlayViewController *o = [OverlayViewController sharedOverlayViewController];
[self.view addSubview:o.view];
}
모달 보기를 표시하는 데 사용할 수 있는 샘플 코드:
[[OverlayViewController sharedOverlayViewController] presentModalViewController:myModalViewController animated:YES];
사용해 본 적이 없습니다.-presentModalViewController:animated:OverlayView 컨트롤러를 사용하지만 이 작업은 잘 수행될 것으로 예상됩니다.
참고 항목:Objective-C 싱글톤은 어떻게 생겼습니까?
저도 같은 문제가 있었는데, 해결책은 addSubview:로 모달 뷰를 추가하고 UIView의 animateWithDuration:delay:options:animation:complete:로 뷰 계층의 변경 사항을 애니메이션화하는 것입니다.
다른 기능이 포함된 UIViewController(FRRViewController)의 하위 클래스에 속성과 두 가지 메서드를 추가했습니다.곧 gitHub에 전체 내용을 게시할 예정이지만, 그때까지 아래 관련 코드를 확인할 수 있습니다.자세한 내용은 블로그를 확인하십시오.투명 모달 뷰 컨트롤러를 표시하는 방법
#pragma mark - Transparent Modal View
-(void) presentTransparentModalViewController: (UIViewController *) aViewController
animated: (BOOL) isAnimated
withAlpha: (CGFloat) anAlpha{
self.transparentModalViewController = aViewController;
UIView *view = aViewController.view;
view.opaque = NO;
view.alpha = anAlpha;
[view.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
UIView *each = obj;
each.opaque = NO;
each.alpha = anAlpha;
}];
if (isAnimated) {
//Animated
CGRect mainrect = [[UIScreen mainScreen] bounds];
CGRect newRect = CGRectMake(0, mainrect.size.height, mainrect.size.width, mainrect.size.height);
[self.view addSubview:view];
view.frame = newRect;
[UIView animateWithDuration:0.8
animations:^{
view.frame = mainrect;
} completion:^(BOOL finished) {
//nop
}];
}else{
view.frame = [[UIScreen mainScreen] bounds];
[self.view addSubview:view];
}
}
-(void) dismissTransparentModalViewControllerAnimated:(BOOL) animated{
if (animated) {
CGRect mainrect = [[UIScreen mainScreen] bounds];
CGRect newRect = CGRectMake(0, mainrect.size.height, mainrect.size.width, mainrect.size.height);
[UIView animateWithDuration:0.8
animations:^{
self.transparentModalViewController.view.frame = newRect;
} completion:^(BOOL finished) {
[self.transparentModalViewController.view removeFromSuperview];
self.transparentModalViewController = nil;
}];
}
}
문제를 해결하기 위해 제가 한 일은 다음과 같습니다. 세부 정보를 검색해 보십시오. 하지만 이 접근 방식은 저에게 매우 효과적이었습니다.
- 기본 보기의 스크린샷을 만듭니다.https://devforums.apple.com/message/266836 - 현재 화면에 대한 UI 보기를 반환하는 기성 메서드로 이어집니다.
- 스크린샷을 모달 보기로 전달(속성을 사용했습니다.
- 모달 뷰를 제시합니다.
- 모달 뷰 컨트롤러의 뷰DidAppear에서 이미지를 인덱스 0의 UIImageView로 설정합니다.상태 표시줄의 높이에 따라 이미지의 수직 위치를 조정합니다.
- 모달 보기 컨트롤러 보기에서 이미지가 사라집니다. 다시 제거합니다.
효과는 다음과 같습니다.
- 보기는 모달 보기와 마찬가지로 에 애니메이션화됩니다. 모달 보기의 반투명 부분이 기존 보기 위를 미끄러집니다.
- 애니메이션이 중지되면 배경이 스크린샷으로 설정됩니다. 이를 통해 이전 보기가 화면 아래에 있는 것처럼 표시됩니다.
- 모달 보기의 사라짐 애니메이션이 시작되는 즉시 이미지가 제거됩니다.한편, OS는 오래된 탐색 보기를 보여주기 때문에 모달 보기는 당신이 예상하는 것처럼 투명하게 미끄러져 시야에서 사라집니다.
나는 나만의 오버레이 뷰로 애니메이션을 시도했지만 잘 작동하지 않았습니다.무엇이 추락했는지 아무런 흔적도 없이 추락했습니다.저는 이것을 쫓기보다는 bg 뷰 & Works를 정말 잘했습니다.
모달 뷰의 코드 - 나머지, 즉 속성 모달View.bgImage 설정...을 확인할 수 있을 것 같습니다.
- (void)viewDidAppear:(BOOL)animated {
// background
// Get status bar frame dimensions
CGRect statusBarRect = [[UIApplication sharedApplication] statusBarFrame];
UIImageView *imageView = [[UIImageView alloc] initWithImage:self.bgImage];
imageView.tag = 5;
imageView.center = CGPointMake(imageView.center.x, imageView.center.y - statusBarRect.size.height);
[self.view insertSubview:imageView atIndex:0];
}
- (void)viewWillDisappear:(BOOL)animated {
[[self.view viewWithTag:5] removeFromSuperview];
}
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:newview animated:YES];
그리고 모달 뷰 배경을 투명하게 설정해야 합니다.
self.view.background = ..알파:0.x;
모달 뷰 컨트롤러에 대해 모달 프레젠테이션 스타일을 다음으로 설정하는 경우:
viewController.modalPresentationStyle = 17;
배경의 보기는 제거되지 않습니다. (TWweetComposeViewController에서 사용)
하지만 나는 이 코드로 앱스토어 리뷰를 통과하려고 하지 않았습니다.
반투명 "로딩 중..." 표시에 대한 게시물입니다.view는 진행 방법에 대한 몇 가지 포인터를 제공할 수 있습니다.
예, 보기를 수동으로 추가해야 하며, 아래에서 슬라이드를 사용하거나 애니메이션을 직접 수행해야 하는 경우에도 마찬가지입니다.
저는 이것을 하기 위해 수업을 썼고, 그 수업을 예로 들어 준모달 데이트 선택기를 썼습니다.
이 블로그 게시물에서 문서를 찾을 수 있습니다. 코드는 github에 있습니다.
저는 지난 일주일 동안 이 같은 문제를 조사해 왔습니다.Google과 StackOverflow에서 찾을 수 있는 다양한 답변과 예제를 모두 시도했습니다.그들 중 누구도 그렇게 잘 작동하지 않았습니다.
iOS 프로그래밍을 처음 접해서, 저는 이런 것을 알지 못했습니다. 그래서 만약 여러분이 버튼의 모달 오버레이(예: 모달이 다른 사람에게 어떤 것을 공유하고 싶은지 묻는 것)를 보여주기 위해 이것을 수행하려고 한다면, 그냥 사용하세요.UIActionSheet.
다음은 이 작업을 수행하는 방법에 대한 예제를 보여주는 웹 페이지입니다.
이 아이디어는 https://gist.github.com/1279713 에서 얻었습니다.
준비:모달 뷰 xib(또는 스토리보드를 사용하는 장면)에서 전체 화면 배경 UIImageView(.h 파일로 후크하여 "backgroundImageView" 속성을 제공)를 0.3알파로 설정했습니다.그리고 뷰(UIView) 배경색을 플레인 블랙으로 설정했습니다.
아이디어: 그런 다음 모달 뷰 컨트롤러의 "viewDidLoad"에서 원래 상태에서 스크린샷을 캡처하고 해당 이미지를 배경 UIImageView로 설정합니다.초기 Y 지점을 -480으로 설정하고 EasyInOut 애니메이션 옵션을 사용하여 0.4초 지속 시간을 사용하여 Y 지점 0으로 슬라이드합니다.뷰 컨트롤러를 해제할 때는 반대로 합니다.
Modal View 컨트롤러 클래스의 코드
.h 파일:
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
- (void) backgroundInitialize;
- (void) backgroundAnimateIn;
- (void) backgroundAnimateOut;
.m 파일:
- (void) backgroundInitialize{
UIGraphicsBeginImageContextWithOptions(((UIViewController *)delegate).view.window.frame.size, YES, 0.0);
[((UIViewController *)delegate).view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
backgroundImageView.image=screenshot;
}
- (void) backgroundAnimateIn{
CGRect backgroundImageViewRect = backgroundImageView.frame;
CGRect backgroundImageViewRectTemp = backgroundImageViewRect;
backgroundImageViewRectTemp.origin.y=-480;
backgroundImageView.frame=backgroundImageViewRectTemp;
[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
backgroundImageView.frame=backgroundImageViewRect;
} completion:^(BOOL finished) {
}];
}
- (void) backgroundAnimateOut{
CGRect backgroundImageViewRect = backgroundImageView.frame;
backgroundImageViewRect.origin.y-=480;
[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
backgroundImageView.frame=backgroundImageViewRect;
} completion:^(BOOL finished) {
}];
}
ViewDidLoad에서 다음을 호출합니다.
[self backgroundInitialize];
[self backgroundAnimateIn];
모달 뷰 컨트롤러를 해제할 때마다 다음과 같이 연락합니다.
[self backgroundAnimateOut];
이렇게 하면 항상 배경 이미지가 활성화됩니다.따라서 이 모달 뷰 컨트롤러 전환 스타일(또는 segue 전환 스타일)이 "수직 피복"으로 설정되지 않은 경우 애니메이션 메소드를 호출할 필요가 없을 수 있습니다.
탐색 또는 탭 모음 인터페이스의 경우 이 매우 좋은 블로그 게시물을 기반으로 보기 컨트롤러를 숨기거나 표시하기 전에 숨김/숨김 해제되는 오버레이 보기 컨트롤러(pix0r의 답변 참조)를 결합하여 마침내 이를 달성했습니다.
뷰 컨트롤러와 관련하여 팁은 백그라운드 뷰를clearColor그러면 반투명 오버레이 뷰가 표시되고 뷰 컨트롤러에서 하위 뷰로 추가되는 모든 뷰가 전면에 표시되며 가장 중요한 것은 불투명합니다.
추가 UI 창에 모달 폼 시트를 표시하기 위해 오픈 소스 라이브러리 MZ FormSheet Controller를 만들었습니다.이를 사용하여 투명 모달 뷰 컨트롤러를 표시하거나 표시된 뷰 컨트롤러의 크기를 조정할 수 있습니다.
8의 경우 iOS 8+를 할 수 .UIModalPresentationOverCurrentContext원하는 동작을 쉽게 달성할 수 있도록 제시된 뷰 컨트롤러를 위한 프레젠테이션 스타일입니다.
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.9f];
viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:viewController animated:YES completion:nil];
iOS 7도 지원해야 하는 경우 이 스레드를 확인하십시오.
보기와 탐색 모음에 투명/반투명 단추를 겹쳐 놓으면 투명/반투명 모달 보기 효과를 얻을 수 있습니다.
UI Navigation Controller의 navigationBar 속성을 통해 탐색 모음에 액세스할 수 있습니다.
UILabel과 달리 UIButton은 마우스 이벤트를 트랩하므로 올바른 모달 동작을 제공합니다.
저는 방금 그것에 대한 해결책을 찾았습니다.1X1의 UIViewController를 생성하여 상위 보기 컨트롤러에 추가하기만 하면 됩니다.그리고 해당 UIViewController에서 투명 모달 뷰 컨트롤러를 보여줍니다.
뷰에 DidLoad;
self.dummyViewController = [UIViewController alloc] init; [self.dummyViewController].뷰 세트프레임:CGRectMake(0, 0, 1, 1)]; [셀프.보기 addSubView:self.dummyViewController.view];
투명 보기 컨트롤러를 열어야 하는 경우;
[self.dummyViewController presentModalViewController:TransparentModalViewController 애니메이션:true];
첨부와 같은 화면이 필요하시면 아래 코드가 도움이 될 수 있습니다.
코드:
MyViewController * myViewController = [[MyViewController alloc] initWithNibName:nibName bundle:nil];
UINavigationController * myNavigationController = [[UINavigationController alloc] initWithRootViewController: myViewController];
myNavigationController.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentModalViewController: myNavigationController animated:YES];
화면 오버레이를 원한다고 말하면 parentViewController.view를 사용하면 탐색 모음 ++ 위에 배치됩니다.
MyCustomViewController* myOverlayView = [[MyCustomViewController alloc] init]; [self.parentViewController.view addSubview:myOverlayView];
이것은 저에게 효과가 있었습니다.
UIViewController *modalViewController = [[UIViewController alloc] init];
modalViewController.view.backgroundColor = [UIColor whiteColor] colorWithAlpha:0.5];
[self showDetailViewController:modalViewController sender:nil];
언급URL : https://stackoverflow.com/questions/849458/transparent-modal-view-on-navigation-controller
'programing' 카테고리의 다른 글
| 트랜잭션 내부의 SELECT 문과 트랜잭션 외부의 SELECT 문이 다릅니까? (0) | 2023.07.31 |
|---|---|
| 너비, 내부 너비 및 외부 너비, 높이, 내부의 차이높이 및 외부높이(jQuery) (0) | 2023.07.31 |
| oracle 프로시저가 정수를 반환합니다. (0) | 2023.07.31 |
| jQuery append() - 추가된 요소 반환 (0) | 2023.07.31 |
| 페이지 다시 로드 없이 Ajax 성공 후 URL 변경 방법 (0) | 2023.07.31 |