code

UIPopoverController는 pushViewController에서 최대 높이로 자동 크기 조정

codestyles 2020. 11. 6. 08:16
반응형

UIPopoverController는 pushViewController에서 최대 높이로 자동 크기 조정


UINavigationController가 포함 된 팝 오버가 있습니다. 팝 오버를 잘 표시 할 수 있으며 navController가 잘 포함되어 있습니다. navController에는 tableView가 포함되어 있으며 항목을 선택하면 새 세부 정보보기가 생성됩니다.

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

그런 다음 새 뷰 컨트롤러를 푸시합니다.

    [self.navigationController pushViewController:detailViewController animated:YES];

문제가 발생하는 경우 : 새보기를 누른 팝 오버가 iPad에서 사용 가능한 최대 높이로 크기가 조정됩니다.

xib의 모든 뷰의 높이를 유연하지 않고 고정 높이로 설정하려고했습니다. 팝 오버의 높이를 명시 적으로 설정해 보았습니다. 나는 또한 다른 뷰 컨트롤러를 자식 뷰로 사용해 보았습니다. 문제는 여전히 남아 있습니다. 팝 오버 새보기가 탐색 컨트롤러에 푸시 될 때마다 자동으로 최대 높이로 크기를 조정 하려고 합니다.

다음은 새 뷰를 푸시 할 때 팝 오버의 크기를 의도적으로 제어하려는 시도를 논의 하는 질문 입니다.

나는 이것이 크기를 제어하는 ​​무차별 대입 방법이라고 생각했습니다. 그러나 이상하게도 실제로는 (보기가 새로 애니메이션되는 것처럼) 몇 가지 빠른 그래픽 문제를 유발하고 위에서 설명한대로 계속 크기를 조정합니다.

즉, 문자 그대로 팝 오버를 최대 높이로 강제하고 있으며 모든 대리자 메서드가 호출 된 후에 발생하는 것 같습니다 .

네비게이션 컨트롤러입니까? 이런 걸 본 사람 있나요?


이것은 동일한 문제가 발생한 후 나를 위해 수정되었습니다 (오늘도 동시에).

편집 : contentSizeForViewInPopover사용되지 iOS7.0않으므로 사용하십시오 preferredContentSize.

아래의 원래 답변 :

detailViewController추가 :

- (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}

또한 다시 NavbarItem을 탭할 때 크기 조정을 방지하기 위해 원래 DeviceDetailViewController와 유사한 것을 추가하려고합니다.


에서 처리하는 것과 마찬가지로이를 처리하는 viewWillAppear또 다른 방법은 재정의하는 것 contentSizeForViewInPopover입니다. 매우 간결 :

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}

IOS5 용

다음에서 수행하는 것이 좋습니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

}

비슷한 문제가있었습니다.

툴바의 버튼에서 팝 오버를 받았습니다. 팝 오버는 특정 크기로 설정되었습니다. 테이블 뷰였습니다. 테이블 행을 선택하면 탐색 컨트롤러가있는 새 뷰 컨트롤러가 호출되었습니다.

뒤로 버튼을 선택하면 팝 오버가 내가 원하는 특정 크기 대신 기본 크기 (내 생각에는 320x1100)가되었습니다.

원래 코드는 다음과 같습니다.

  MyTableViewController *myVC = [[MyTableViewController alloc] init];
  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  [myVC release];
  [navController release];
  [popover release];

문제를 해결하기 위해 한 줄을 추가했습니다. 당연히 헤더의 높이를 빼야했기 때문에 일종의 해결 방법입니다. 아마도 여러분 중 한 명이 더 나은 방법으로 나를 깨우쳐 줄 수있을 것입니다. 어쨌든 작동합니다.

  MyTableViewController *myVC = [[MyTableViewController alloc] init];

  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  //Subtract the height of the header to match the total popover size (not just the view).
  myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44);

  [myVC release];
  [navController release];
  [popover release];

내비게이션 컨트롤러가 관련되어 있고 뒤로 버튼을 누르면 팝 오버가 기본 크기로 기본 설정됩니다. 뷰 컨트롤러 myVC에 대한 contentSizeForViewInPopover 속성을 추가하여 특정 크기를 강제합니다.

이것이 도움이되기를 바랍니다.

커트


iOS 7의 경우 다음을 사용하십시오.

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}

UIViewController.contentSizeForViewInPopover iOS 7에서 먼저 사용되지 않습니다.


애니메이션의 그래픽 결함에 대한 응답 :

UIPopoverController 애니메이션은 내부에 UINavigationController가있는 팝 오버를 생성하는 경우 UINavigation 컨트롤러 애니메이션과 충돌합니다. 애니메이션 할 때 그래픽 결함이 발생합니다. 문제를 해결하려면 다른 컨트롤러를 누르거나 도구 모음을 표시 할 때 animated 매개 변수를 false로 설정하십시오.

뷰 컨트롤러 푸시 :

[self.navigationController pushViewController:detailViewController animated:NO];

도구 모음 표시 :

[[self navigationController] setToolbarHidden:NO animated:NO]; 

animated : NO를 설정하면 UIPopoverController에서 애니메이션이 올바르게 표시됩니다.


contentSizeForViewInPopover다음 컨트롤러를 탐색 스택에 푸시하기 전에을 설정하지 않는 이유는 무엇 입니까? 크기를 설정할 필요가 없습니다 viewWillAppear.

[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];

IOS 5.1에서 작동


Slight varient on borked's advice (which pointed me in the right direction, thanks for that!), here's what I do when pushing a new controller to maintain the size before pushing it:

productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;

[self.navigationController pushViewController:productViewController animated:YES];

I like this because I don't have to hardcode the popover values in every view controller (good since I use them at various heights).

The self.contentSizeForViewInPopover line is to preserve the size when the user hits back. I guess you could put this line somewhere else, like viewWillAppear or wherever you like.

Seems to work...


In the -(void)viewDidLoad of all the view controllers you are using in navigation write the code:

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

There are two ways to set the contentSizeForViewInPopover in the storyboard. You can set your view controllers that are with your navigation controller, to FreeForm and set the root views to the desired size. Or, you can keep the simulated metric as inferred and check "Use Explicit Size" and set the size you want there.

Then, in each view controller that is within your navigation controller, add the following...

- (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];

     ["yourpopoverController" setPopoverContentSize:CGSizeMake(self.
           contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self.
           navigationController.navigationBar.frame.size.height) animated:YES];
}

In the transition animation, the new view will come in aligned with the top, and then the height will be adjusted accordingly.

This way, you don't have to override contentSizeForViewInPopover, or specify some other size specifically in your view controllers. It's all in the storyboard.

If one of your view controllers has a variable height, then you do need to override contentSizeForViewInPopover in that view like so...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}

This stuff may have worked once but not with xCode 6 wherein contentSizeForViewInPopover is deprecated. Luckily it's respected at storyboard load time. I downloaded an xml editor (Xmplify) and hacked the storyboard. Set the key contentSizeForViewInPopover to the size you want. Save and replace (make a copy first) storyboard.

More specifically :

< viewController>

     <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >

</viewController>

Don't work for me, when i use this:

[UIPopoverController 
    [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] 
]

When appear popover is all good, press button on vc1 and push vc2 to navigation controller

Next return to vc1 (root) pressing button in vc2 (popToRootViewController method);

We can see that popover change own size, but vc1 size is old... WHAT IS THIS???

Ok, now work... Add popover property in my controller

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;

Running Swift 4 and iOS 11 the only possible solution was for me. To use showViewController:sender: and showDetailViewController:sender: instead of presentViewController:animated:completion:.

From the Apple Doc

The showViewController:sender: and showDetailViewController:sender: methods offer the most adaptive and flexible way to display view controllers. These methods let the presenting view controller decide how best to handle the presentation. For example, a container view controller might incorporate the view controller as a child instead of presenting it modally. The default behavior presents the view controller modally.

참고URL : https://stackoverflow.com/questions/3458722/uipopovercontroller-automatically-resizing-to-max-height-on-pushviewcontroller

반응형