-2

iOS 11으로 업그레이드 한 후 대개 동작이 실행 된 탐색 표시 줄 버튼 좌표에 presentPopoverFromRect:sender.frame으로 설정된 프레임이있는 잘못된 배치 된 팝업에 문제가 발생했습니다.iOS 11로 업그레이드 한 후 잘못 배치 된 팝업 표시

문제 : (UIButton *)sender.frame의 x 및 y 좌표는 {0,0}과 동일한 이고 화면의 왼쪽 상단 모서리에 팝업이 표시됩니다.

사용자 탐색 버튼을 생성하는 generateToolbar() 방법입니다. 여기

-(void) generateToolbar { 

    // Initialize the `ButtonFactory` 

    ButtonFactory *buttonFactory = [[ButtonFactory alloc] init]; 

    // Generate some UIButton(s) 

    UIButton *userUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeUser iconVisibility:YES textVisibility:NO capitalization:NO iconSize:20 textSize:10]; 
    userUIBtn.frame = CGRectMake(0,0,55,20); 
    [userUIBtn addTarget:self action:@selector(userButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

    // Generate an `UIBarButtonItem` with the `UIButton` as basis 

    UIBarButtonItem *userBtn = [[UIBarButtonItem alloc] initWithCustomView:userUIBtn]; 

    // Add the `UIBarButtonItem` into the right side of the `navigationItem` 

    self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, nil]; 

    DDLogVerbose(@"A: generateToolbar UIButton FRAME: %@",NSStringFromCGRect(userUIBtn.frame)); 

} 

사용자 버튼을 누름으로써 트리거하는 버튼 주위 팝 오버를 생성 도착 userButtonPressed() 방법이다.

- (IBAction) userButtonPressed:(UIButton *)sender { 

    // Initialize the `ButtonFactory` 

    ButtonFactory *buttonFactory = [[ButtonFactory alloc] init]; 

    // Generate some UIButtons   

    UIButton *feedbackUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeFeedback iconVisibility:YES textVisibility:YES capitalization:NO iconSize:20.0 textSize:20.0]; 
    [feedbackUIBtn addTarget:self action:@selector(feedbackBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    feedbackUIBtn.frame = CGRectMake(0,50,300,50); 

    // Create a `UIViewController` and add the `UIButtons` as subviews 

    UIViewController *viewController = [[UIViewController alloc] init]; 
    [viewController.view addSubview:feedbackUIBtn]; 
    [viewController.view addSubview:crashUIBtn]; 

    // Create the `UIPopoverController` 

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
    self.mainPopoverController = [[UIPopoverController alloc] initWithContentViewController:navigationController]; 
    self.mainPopoverController.popoverContentSize = CGSizeMake(300, 100); 

    DDLogVerbose(@"B: userButtonPressed SENDER FRAME: %@",NSStringFromCGRect(sender.frame)); 

    // Present the `UIPopoverController` 

    [self.mainPopoverController presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES]; 
} 

로그 출력 -은 X가 Y 좌표 {0, 0} 동등한 두 곳에서, 잘못 그들은 UIBarButtonItem의 배위 실제 비 - 제로와 동일해야한다 :

A: generateToolbar UIButton FRAME: {{0, 0}, {55, 20}} 
B: userButtonPressed SENDER FRAME: {{0, 0}, {55, 32}} 
+1

질문에 _relevant_ 코드 만 표시하십시오. NSAttributedString 할당을 읽지 않아도됩니다. 어쩌면 [mcve]의 읽을 수있다 –

답변

1

UIBarButtonItem이 UIView가 아니며 frame이 없기 때문에 "탐색 바 버튼의 좌표에 대한"개념은 이해가되지 않습니다. 팝업 화살표를 UIBarButtonItem으로 향하게하는 방법은 팝 오버 프리젠 테이션 컨트롤러의 barButtonItem을 설정하는 것입니다. (popover 프리젠 테이션 컨트롤러 :이 요일과 시간에는 UIPopoverController를 사용하지 않아야합니다.)

+0

당신은 내가 [[self.mainPopoverController presentPopoverFromRect : sender.frame inView : self.view permittedArrowDirections : UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp 애니메이션 : 예];'with [self.mainPopoverController presentPopoverFromBarButtonItem : 보낸 사람 allowedArrowDirections : UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated : YES]'? 한 가지 문제가 있습니다. 호환되지 않는 유형 인'UIButton'과'UIBarButtonItem'입니다. –

+1

'presentPopoverFromRect'를 전혀 호출하지 말아야한다는 뜻입니다. 당신은 10 년 동안 무엇을 살고 있습니까? UIPopoverController는 오래 전에 사용되지 않았습니다. 현대적인 팝 오버를 사용하고 프로그램에 참여하십시오. – matt