programing tip

모달보기 컨트롤러의 iPad 사용자 정의 크기

itbloger 2021. 1. 9. 09:35
반응형

모달보기 컨트롤러의 iPad 사용자 정의 크기


특정 크기의 모달 뷰 컨트롤러가 두 개 있습니다. 내 크기에 맞는 modalPresentationStyle이 없기 때문에 사용자 지정보기 (현재보기 위에 전체 화면 검은 색 반투명 ​​오버레이 만들기, 해당보기 위에 모달보기 추가, 애니메이션 수행 등)를 사용하지 않으려 고합니다. 컨트롤러.

이제 UIModalPresentationPageSheet를 사용하고 있지만 뷰의 높이가 더 작고보기 흉한 빈 공간이 있습니다.

원하는 프레젠테이션

 _______________
|    _______    |
|   |       |   |
|   |  MyVC |   |
|   |       |   |
|    -------    |
 --------------- 

실제 프레젠테이션

 _______________
|   |       |   |
|   |  MyVC |   |
|   |       |   |
|   |-------|   |
|   | blank |   |
 ---------------    

UIModalPresentationFormSheet를 사용하면 컨테이너 너비가 더 작습니다.

나는 그것을하는 방법을 알아 내려고 노력하고 있지만 그것이 가능한지 모르겠습니다. presentationStyles보다 작은 모달 VC를 표시하는 문제에 대한 해결책은 무엇입니까? 유일한 해결책은 "커스텀 모달 뷰 컨트롤러 엔진"을 배열하는 것입니까? 팝 오버가 내 디자인 요구 사항에 맞지 않습니다.


다른 사용자들과 마찬가지로 모달 뷰 컨트롤러의 출처가 정확하지 않다는 문제도있었습니다. 몇 번의 실험 끝에 저에게 맞는 해결책을 찾았습니다.

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];   
    self.view.superview.bounds = CGRectMake(0, 0, <width>, <height>);
}

다음 을 사용하여 다음 결과 ( 링크 텍스트 )를 얻었습니다 .

self.modalPresentationStyle = UIModalPresentationFormSheet;

그리고 그것을 모달 뷰 컨트롤러로 제시함으로써. 도움이 더 필요하면 알려주세요.


이 모든 답변은 ios8 SDK에서 작동하지 않습니다.

이것은 작동합니다 :

AboutViewController * _aboutViewController = [[AboutViewController alloc] init];
    _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet;
    if(IS_IOS8)
    {
        _aboutViewController.preferredContentSize = CGSizeMake(300, 300);
    }
    [self presentViewController:_aboutViewController animated:YES completion:nil];

AboutViewController.m에서

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    if(!IS_IOS8)
    {
        self.view.superview.bounds = CGRectMake(0, 0, 300, 300);
    }
}

IS_IOS8

#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)

iOS 8에서는 더 많은 사용자 지정 옵션을 제공하는 UIPresentationController를 사용할 수도 있습니다.


ViewController.view.superview.frame처음에 무엇이 설정되어 있는지 알아낼 때까지 사용자 지정 크기의 모달을 중앙으로 가져 오는 데 문제가있었습니다 . UIModalPresentation 유형에 따라 결정됩니다. superview.center필요하지도 않습니다 (내 테스트가 보여주는 한).

또한를 사용하여 좌표를 동적으로 설정하고 [UIScreen mainScreen].applicationFrame현재는 가로 방향 만 지원합니다. X / Y 및 높이 / 너비 값을 뒤집어 세로 및 가로를 모두 지원하려면 조건부 확인을 수행해야합니다.

다음은 iOS 6.0 용 첫 번째 작업 솔루션입니다.

ViewController.modalPresentationStyle = UIModalPresentationFormSheet;
ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:ViewController animated:YES completion:nil];
ViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
ViewController.view.superview.frame = CGRectMake(
                                                                    // Calcuation based on landscape orientation (width=height) 
                                                                    ([UIScreen mainScreen].applicationFrame.size.height/2)-(320/2),// X
                                                                    ([UIScreen mainScreen].applicationFrame.size.width/2)-(320/2),// Y
                                                                    320,// Width
                                                                    320// Height
                                                                    );

그리고 이전 답변을보고 손바닥을 댔습니다. 마지막 줄을 다음으로 대체하여 솔루션을 약간 줄입니다.

ViewController.view.superview.bounds = CGRectMake(0, 0, 320, 320);

최종 솔루션 및 비고를 편집하십시오 .


이를 수행하는 가장 좋은 방법은 폼 시트 내에 표시되는 뷰의 수퍼 뷰에서 경계 속성을 변경하는 것입니다. 보기를 모달로 표시하면 표시되는보기가 다른보기에 포함됩니다.

superview의 bounds 속성을 뷰의 경계와 동일한 rect로 설정해야합니다. 먼저 수업에 개인 ivar를 추가하십시오.

@implementation MySpecialFormsheet {
    CGRect _realBounds;
} 

에서이 작업을 수행하는 것이 가장 좋습니다 viewWillAppear:. 모달로 제공되는 뷰 컨트롤러에 다음 코드를 추가합니다.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.view.superview.bounds = _realBounds;
}

당신은 캐시 할 필요가 _realBounds당신의 viewDidLoad방법 :

- (void)viewDidLoad {
    _realBounds = self.view.bounds;
    [super viewDidLoad];
}

이것은 자동 레이아웃이 아닌보기 (자동 레이아웃으로 시도한 적이 없음)에 대한 내 솔루션이며 iOS 7 및 iOS 8과 호환됩니다.

처음에는 다음과 같은 방식으로 모달 뷰를 호출해야합니다.

CloudSettingsViewController *cloudController = [[CloudSettingsViewController alloc] initWithNibName:@"CloudSettingsView" bundle:nil];

CGRect originalBounds = cloudController.view.bounds;

cloudController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
cloudController.modalPresentationStyle = UIModalPresentationFormSheet;

[self presentViewController:cloudController animated:YES completion:nil]; 

iOS 8에서는 모달보기의 viewDidLoad 메서드에서 preferredContentSize를 설정합니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    // backup of the original size (selected in interface builder)
    height = self.view.frame.size.height;
    width = self.view.frame.size.width;

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) // versioni successive ios 8
        self.preferredContentSize = CGSizeMake(width, height); // this is necessary to get the correct size of the modal view
}

This works ALSO when the modal view needs to display the keyboard on iPad.

With previous versions of iOS 8 you should set the bounds after presentViewController call:

[currentController presentViewController:controlPanelController animated:YES completion:nil];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8) 
    cloudController.view.superview.bounds = originalBounds;//it's important to do this after 

even for reducing the forma sheet height and width you can use

[self.view.superview setBounds:CGRectMake(0, 0, 450, 480)];

The approaches described above need to be tweaked for iOS7:

// set desired bounds, then call -presentFromViewController:

@implementation PresentedViewController
{
    CGRect _presentationBounds;
}

- (void)presentFromViewController:(UIViewController *)viewController
{
    self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    self.modalPresentationStyle = UIModalPresentationFormSheet;

    _presentationBounds = self.view.bounds;

    [viewController presentViewController:self animated:YES completion:nil];
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    if (!CGRectIsEmpty(_presentationBounds))
    {
        self.view.superview.bounds = _presentationBounds;
        _presentationBounds = CGRectZero;
    }
}

(This code also works on iOS6.)


Even I was struggling with the same issue for quite a while. After giving few tries from many of the answers given here I came up with a solution that worked for me pretty well.

Here is the code while presenting the view controller.

    SomeViewController *sovcObj = [[SomeViewController alloc] initWithNibName:@"SyncOptionsViewController" bundle:nil];
someObj.modalPresentationStyle = UIModalPresentationFormSheet;
someObj.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:someObj animated:YES completion:nil];
someObj.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want

In the xib (if you are using one) in the 'Simulated Metrics' section select 'Freeform' size.

Apart from this you need to write the below code in your presented view controller (i.e.., SomeViewController in this example)

- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
self.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want

}

This code also works for iOS 7 as well


One solution is to use UIModalPresentationPageSheet to present a page sheet and then immediately resize the modal view. This is fully explained in this answer to another question.


Resize the modal view "after" it is presented using presentModalViewController method.See this link to resize modal View https://coderwall.com/p/vebqaq


You can use MZFormSheetController like this:

MZFormSheetController *formSheet = [[MZFormSheetController alloc] initWithSize:customSize viewController:presentedViewController];
[presentingViewController mz_presentFormSheetController:formSheet animated:YES completionHandler:nil];

This solution worked for me as I had the same issue.

My modal view structure is the following (I use UIModalPresentationCurrentContext at both presenting and presented controllers to achieve transparency in the presented VC)

ModalViewController
  > UIView (view) - resized to the same size as the presenting controller but has semi-translucent background - done automatically
      >> UIView (contentView) - the true view with the content of the popup - this is the one that got consistently placed at the top of the screen all the time

In ModalViewController I overwrote the following method to fix the positioning issue:

- (void) viewWillLayoutSubviews(){
  [super viewWillLayoutSubviews];

  CGRect r = self.view.bounds();
  self.contentView.center = CGPointMake(r.size.width/2,r.size.height/2);
}

I actually create and size the content view first but in different method.

Hope this helps someone.

ReferenceURL : https://stackoverflow.com/questions/3298378/ipad-custom-size-of-modal-view-controller

반응형