Program Tip

UINavigationController를 사용하지 않고 Storyboard에서 UINavigationBar의 높이를 변경하는 방법이 있습니까?

programtip 2020. 12. 8. 19:51
반응형

UINavigationController를 사용하지 않고 Storyboard에서 UINavigationBar의 높이를 변경하는 방법이 있습니까?


계층 구조 UINavigationBar의 일부가 아닌 내보기 중 하나 에서 사용자 지정을 사용하고 UINavigationController싶습니다. UINavigationBar를 스토리 보드로 드래그하면 다음과 같이 표시됩니다.

UINavigationBar

이 표시 줄은 44px로, 상태 표시 줄이이 공간을 공유하지 않는 경우 충분합니다. iOS7에서는 상태 표시 줄의 공간을 포함하여 전체 화면을 사용할 수 있으므로는 UINavigationBar44px가 아니라 64px이어야합니다.

뷰를 UINavigationController의 계층 구조에 연결하면 올바르게 표시됩니다.

UINavigationController

나는 어딘가에 읽는 경우 (가) UINavigationBar속성이 barPosition:로 설정을 UIBarPositionTopAttached한 후 바 64px 될 것이다. 그러나 이것은 readonly속성입니다.

내 검색 결과에 "해결 방법"이라고 생각되는 내용 만 표시되었습니다. UINavigationController이 앞에 쓸모없는 것을 추가하면 UIViewController계층이있는 척할 수 있으며 UINavigationBar64px로 자동으로 추가 됩니다.

64px를 다루는 '불량'(내비게이션 컨트롤러의 도움없이)을 가질 수있는 방법 정말로UINavigationBar 없습니까? 그렇다면 그 이유에 대한 타당한 이유가 있습니까?

( UINavigationBar기본적으로 64px가되어야한다고 말하는 것은 아니지만 검사자에 옵션이 있어야합니다)

(저는 또한이 문제를 해결하기 위해 프로그래밍 방식으로 응답하는 사람들을 봅니다. 이러한 답변이 작동하더라도 여전히이를 염두에두고 스토리 보드 디자인 해야합니다 (격차). 제가 알고 싶은 것은 이것을 설정할 수 있는지 여부입니다. 스토리 보드 또는 오히려 허용되지 않는 이유는 무엇입니까?)


속성 barPositionUIBarPositionTopAttached다른 방법으로 설정할 수 있습니다 !

  1. UINavigationBar에 대리인을 추가합니다.
  2. -positionForBar:위임 클래스에서 구현 하십시오.

    - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
    {
        return UIBarPositionTopAttached;
    }
    

내비게이션 바의 상단도 상단 레이아웃 가이드에 고정되어야합니다.


프로그래밍 방식으로 탐색 모음 높이를 변경할 수 있습니다.

[navBar setFrame:CGRectMake(0, 0, 320, 64)];

편집 : 주석에서 썼 듯이 viewDidLayoutSubviews자동 레이아웃을 피하기 위해이 줄을 넣어야 할 수도 있습니다 .


Interface Builder의 'Identity Inspector'에서 'User Defined Runtime Attributes'를 사용하여 뷰 상단에 첨부하도록 설정할 수 있습니다. barPosition속성을 설정합니다 .

여기에 이미지 설명 입력

barPosition속성에 대한 문서는 다음과 같습니다 . https://developer.apple.com/library/ios/documentation/uikit/reference/UIBarPositioning_Protocol/Reference/Reference.html


를 사용 UINavigationController하거나 프로그래밍 방식으로 설정하지 않고도이를 수행 할 수있는 방법이 있습니다. 내비게이션 바의 높이 제한을 원하는대로 설정하면됩니다 (이 경우 64).

다음과 같이 프로그래밍 방식으로 동일한 작업을 수행 할 수 있습니다.

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:navigationBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:64.0f]];

편집하다:

@의 Nerdist의 식민지가 지적한 바와 같이 자동 레이아웃 작업을 할 때, 항상 세트에있었습니다 translatesAutoresizingMaskIntoConstraintsNO제약에서 그렇지가있을 수 있습니다 충돌합니다.


독립 실행 형 UINavigationBar도 사용하고 있으며 동일한 문제가 발생했으며 두 가지 방법이 올바르게 수정되었음을 알았습니다.

제약 조건과 부모 UIView를 사용하여 수정했습니다. 스토리 보드에서이 UIView를 {0, 0, 320, 64} 프레임이있는 UINavigationBar의 상위 뷰로 설정했습니다. UINavigationBar가 원하는 크기를 갖도록 강제하는 제약 조건 또는 제약 조건 집합을 추가 할 수 있습니다. 부모 UIView가 스토리 보드에 올바른 프레임을 가지고 있다면 스토리 보드의 다른 뷰를 평소처럼 레이아웃 할 수 있습니다.

이제 자동 레이아웃이 비활성화 된 경우 Lindsey의 답변에 설명 된대로 프로그래밍 방식으로 막대 높이를 변경할 수 있습니다. -(void)viewDidLayoutSubviews그것을하기에 좋은 장소 인 것 같습니다.


Autolayout을 사용하는 경우 UINavigationBar의 제약 조건 높이를 64 이상으로 설정할 수 있습니다.


@startupThekid :

UINavigationController가 관리하는 UINavigationBar에 대한 자동 크기 조정 마스크를 변경하려고하면 iOS에서 예외가 생성됩니다.

그러나 게시 한 객관적인 C 코드에 해당하는 Swift는 다음과 같습니다.

var navBar = self.navigationController!.navigationBar 

에서 viewDidAppear : ()

navBar.setTranslatesAutoresizingMaskIntoConstraints = false

제약 조건을 설정해야하는 경우 :

var navBarHeightConstraint = 
      NSLayoutConstraint(item: navBar, attribute: .Height,
            relatedBy: .Equal, toItem: nil, 
            attribute: .Height, multiplier: 1, constant: height)

self.view.addConstraint(navBarHeightConstraint)

그 후에는 장치 방향 변경과 같이 탐색 모음 높이를 변경하는 데 필요에 따라 제약 조건의 상수 속성을 수정할 수 있어야합니다.


최소한의 코드 개입으로이를 수행하는 방법을 자세히 설명하는 블로그 게시물을 작성했습니다. 막대는 스토리 보드에 간격을 표시하지만 장치에서는 제대로 작동합니다. 요컨대, 단계는 다음과 같습니다.

1) 스토리 보드의 뷰 컨트롤러에 내비게이션 바를 추가합니다.

2) Set the constraints for the navigation bar in the storyboard:
- Navigation Bar.Top = Top Layout Guide.Bottom
- Navigation Bar.Leading = Superview.Leading
- Navigation Bar.Trailing = Superview.Trailing

3) Connect the storyboard's navigation bar to its view controller as an @IBOutlet.

4) In the view controller's class, add a UINavigationBarDelegate protocol to the class declaration.

5) In the view controller's viewDidLoad method, set the navigation bar's delegate to self.

6) In the view controller, add the bar positioning delegate's positionForBar method. Return the UIBarPosition representing TopAttached. (Note: UINavigationBarDelegate inherits this method from UIBarPositioningDelegate.)

The full post with GIF images is here:
Easily use a Navigation Bar without a corresponding Navigation Controller

These steps work as of Swift 2.1/Xcode 7.2


In Swift 3 using the main storyboard you can use constraints to change the height and make it work. This was the way that I found is easy to implement.

Creating the constraints.

What it looks like in the end.


I was in the same boat and having problems, but now I've fixed it. I'm trying to do the right things to avoid setting the frame explicitly, which is desirable for future-proofing and easy support for different device sizes. In my case, I'm wanting a webview beneath a navigation bar.

I'm setting my view controller to be a UINavigationBarDelegate and implementing positionForBar: to return UIBarPositionTopAttached, like user3269713's answer. It seemed like the other trick was to use auto-layout to position the bar below the topLayoutGuide.

This was the code I was using in viewDidLoad after creating navigation bar & webview programmatically, and I was still seeing the bar stuck at height 44 but couldn't immediately see why:

    [navigationBar sizeToFit];
    navigationBar.delegate = self;
    [self.view addSubview:navigationBar];
    [self.view addSubview:webView];
    id guide = self.topLayoutGuide;
    NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[guide][navigationBar][webView]|" options:0 metrics:nil views:viewNamesDict]];

But I did some more thinking and playing around with auto-layout, and it turns out it that alone was the cause of my problem. I was trying to rely on navigation bar's translated constraints from its autoresizing mask, but it turned out I needed to defined them explicitly. Here's my new viewDidLoad code that works:

    [navigationBar sizeToFit];
    navigationBar.delegate = self;
    navigationBar.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:navigationBar];
    [self.view addSubview:webView];
    id guide = self.topLayoutGuide;
    NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[navigationBar]|" options:0 metrics:nil views:viewNamesDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]];
    NSString *verticalLayoutVisualExpression = [NSString stringWithFormat:@"V:|[guide][navigationBar(%f)][webView]|", navigationBar.frame.size.height];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalLayoutVisualExpression options:0 metrics:nil views:viewNamesDict]];

And yes, as I'd hoped, this automatically moves the bar when turning to landscape and the status bar hides.

(I heartily recommend a auto-layout helper like Masonry which makes layout code more concise, and Masonry, for one, takes care of turning off translatesAutoresizingMaskIntoConstraints for you)


I know this is a very hacky way of doing this, but for me it worked. I have a NavigationViewController and I want to load a ViewController modally which has a UINavigationBar at the top with Done and Cancel buttons. This is what it looked like:여기에 이미지 설명 입력

보시다시피 상단에 흰색 띠가있어서 UINavigationBar. UINavigationBar프로그래밍 방식으로 높이를 변경하는 대신 새 뷰를 만들고 배경색을 UINavigationBar(HEX = F8F8F8, RGBA = 248,248,248,1.0) 과 동일하게 설정했습니다 . 다시 말하지만, 이것이 슈퍼 해 키라는 것을 알고 있지만 그것은 나를 위해 일을 수행합니다. 지금은 다음과 같습니다.

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/20439167/is-there-a-way-to-change-the-height-of-a-uinavigationbar-in-storyboard-without-u

반응형