UIAlertController는 leftBarButtonItem을 아래로 이동합니다. (UIAlertController moves leftBarButtonItem down)


문제 설명

UIAlertController는 leftBarButtonItem을 아래로 이동합니다. (UIAlertController moves leftBarButtonItem down)

UIAlertControllerStyleAlert의 기본 스타일로 UIAlertController를 만들었습니다. leftBarButtonItem을 탭하면 경고가 표시됩니다. backButton이라는 UIBarButtonItem 속성을 만들고 leftBarButtonItem = self.backButton을 설정했습니다. 이것은 설계된 대로 작동합니다. 저는 스토리보드를 사용하지 않습니다.

문제는 경고가 표시될 때 leftBarButtonItem이 아래로 이동한다는 것입니다(내 추측: 약 20pts). 왜 이런 일이 발생합니까?

버튼이 아래로 이동했을 때 사용자가 버튼을 볼 수 없도록 버튼을 표시/숨기는 방법을 알고 있습니다. 그러나 그것은 짜증난다. 처음에 왜 이런 일이 발생합니까?

나는 하지 않았습니다. 온라인에서 유사한 문제를 모든 발견했습니다.

@property (strong, nonatomic) IBOutlet UIBarButtonItem *backButton;

viewDidLoad:

6
self.backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)];
[self.backButton setImage:[UIImage imageNamed:@"back‑arrow‑grey"]];
self.navigationItem.leftBarButtonItem = self.backButton;

backButtonPressed:

6
{
    self.navigationItem.leftBarButtonItem = nil; //to hide backButton because it moves down
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"My title" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *actionLeave = [UIAlertAction actionWithTitle:@"Leave" style:UIAlertActionStyleDefault handler:...//which works correctly

    UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"Go back" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        self.navigationItem.leftBarButtonItem = self.backButton; //to show backButton again now that the alert is dismissed
        //other things happen here that work as designed
    }];

    [alertController addAction:actionLeave];
    [alertController addAction:actionCancel];
    [self presentViewController:alertController animated:YES completion:^{}];
}

참조 솔루션

방법 1:

I also encountered this issue. Searching for other issues about vertical mis‑positioning of the left bar button item took me to this question. The gist of it is that this problem occurs, for unknown reasons, if you have a bar button item that has an image, but an empty string as it's title. Set the title to a single space instead of just an empty string:

self.backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)];

I don't know if it will fix it for you, but it mostly did for me ‑ the button still does a slight 'jump' animation as though it's being newly created (but only the first time it appears) ‑ but it stays at the same vertical position.

Edit: Passing in nil as the title also removes the extraneous animation. Seems like this is just a peculiarity in how iOS handles whitespace strings as titles.

방법 2:

 barbutton.title = nil;

Set title nil and this work for me.

(by jungledevXonokrish)

참조 문서

  1. UIAlertController moves leftBarButtonItem down (CC BY‑SA 2.5/3.0/4.0)

#uinavigationcontroller #uinavigationitem #objective-c #uialertcontroller






관련 질문

세로에서 가로로 회전할 때 UIBarButtonItem 크기를 변경하는 방법은 무엇입니까? (how to change the UIBarButtonItem size when rotate from the portrait to landscape?)

performSegueWithIdentifier는 식별자 오류가 있는 segue를 생성하지 않습니다. (performSegueWithIdentifier produce no segue with identifier error)

UIAlertController는 leftBarButtonItem을 아래로 이동합니다. (UIAlertController moves leftBarButtonItem down)

현재 모달 보기는 탐색 스택에서 탐색 모음을 숨깁니다. (present modal view hides the navigation bar in navigation stack)

테이블 뷰 셀을 선택할 때 뷰 컨트롤러를 푸시할 수 없습니다. (Can't push my view controller when I select a table view cell)

프로그래밍 방식으로 탐색 컨트롤러의 초기 viewController 설정(레이어 SDK) (Set initial viewController in Navigation controller programmatically (Layer SDK))

UIViewController 유형의 표현식으로 UINavigationController를 초기화하는 호환되지 않는 포인터 유형 (Incompatible pointer types initializing UINavigationController with an expression of type UIViewController)

탐색 컨트롤러 도구 모음 크기 및 위치 - iOS Swift (Navigation Controller Toolbar Size & Location - iOS Swift)

Segue는 뒤로 막대 버튼에 데이터를 저장합니다. (Segue saves data on back bar button)

UINavigationController 푸시 전환 중 낮은 프레임 속도 (Low frame rate during UINavigationController push transition)

뷰 컨트롤러에서 탐색 모음의 모양 재설정 (Reset the appearance of navigation bar in a view controller)

탐색 모음 제목 보기 내에서 분할된 제어 스위치를 처리하려고 합니다. (Trying to handle segmented control switch inside of navigation bar title view)







코멘트