Программно получить высоту панели навигации

Я знаю, что наличие большего контроллера вида (навигационная панель) толкает вниз UIView по его высоте. Я также знаю, что эта высота = 44px. Я также обнаружил, что этот толчок вниз поддерживает [self.view].frame.origin.y = 0.

Итак, как определить высоту этой навигационной панели, кроме как просто установить ее на константу?

или, более короткая версия, как определить, что мой UIView отображается с навигационной панелью сверху?


лампочка начал приходить в себя. К сожалению, я не нашел единого способа исправить проблему, как описано ниже.

Я считаю, что вся моя проблема сосредоточена на моих autoresizingMasks. И причина, по которой я пришел к выводу, что те же симптомы существуют, С или без UIWebView. И этот симптом в том, что для портрета все идеально. Для ландшафта самый нижний UIButton всплывает за полосой табуляции.

например, на одном UIView у меня есть, сверху до дно:

UIView-оба набора пружин (случай по умолчанию) и без стоек

UIScrollView-если я установил две пружины и очистил все остальное (например, UIView), то UIButton вторгается в объект непосредственно над ним. Если я очищу все, то UIButton в порядке, но материал на самом верху скрывается за панелью состояния, устанавливающей только верхнюю стойку, UIButton появляется за панелью вкладок.

UILabel и UIImage рядом вертикально – верхний набор распорки, гибкий повсюду

просто, чтобы завершить картину для немногих, которые имеют UIWebView:

UIWebView-распорки: верхние, левые, правые весны: оба

UIButton-ничего не установлено, т. е. гибко везде

хотя моя лампочка тусклая, кажется, есть надежда.


пожалуйста, медведь со мной, потому что мне нужно больше места, чем для короткого ответа комментарий.

Спасибо за попытку понять, что я на самом деле рыбалка для... вот так.

1) Каждый UIViewController (приложение TabBar) имеет UIImage, некоторый текст и все, что сверху. Другим общим знаменателем является UIButton на дне. На некоторых UIViewControllers у меня есть UIWebView над UIButton.

Итак, UIImage, текст и т. д. UIWebView (на некоторых) UIButton

окружающий все выше является UIScrollView.

2) Для тех, у кого есть UIWebView, его маска авторезки выглядит например:

   —
   |
   —

   ^
   |
   |

|-| ←----→ |-| | | В. Маска UIButton не имеет ничего установленного, т. е. гибкого везде

В my-viewDidLoad я вызываю my-repositionSubViews, в котором я делаю следующее:

Если нет UIWebView, я ничего не делаю, кроме центра UIButton, который я разместил с IB.

Если у меня есть UIWebView, то я определяю его высоту*content * и устанавливаю его кадр, чтобы заключить весь содержание.

UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
                          sameWholeViewScrollerWidth, webViewContentHeight)]

как только я это сделаю, я программно нажимаю UIButton вниз, чтобы он оказался под UIWebView.

все работает, пока я не поворачиваю его от портрета к пейзажу.

Я называю my-repositionSubViews в моей-didRotateFromInterfaceOrientation.

почему высота содержимого моего UIWebView не изменяется с вращением?.

от портрета к ландшафту, ширина содержания должна расширить и высота содержимого должна уменьшаться. Он делает визуально, как должен, но не в соответствии с моим NSLog.

В любом случае, с UIWebView или без него, кнопка, о которой я говорил, перемещается под полосой табуляции в ландшафтном режиме, но она не будет прокручиваться вверх. Я вижу его за полосой табуляции, когда прокручиваю "энергично", но затем он" падает " за полосой табуляции.

нижняя строка, это последняя причина, по которой я спросил о высоте панели вкладок и панели навигации, потому что панель вкладок сажает себя в нижней части UIView и NavigationBar толкает UIView вниз.

Теперь, я собираюсь добавить комментарий или два здесь, потому что они не имело смысл раньше.

без UIWebView, я оставляю все, как видно из IB.

С помощью UIWebView я увеличиваю кадр UIWebView.высота к своему contentHeight и также регулирует вверх высоту окружающего UIScrollView который окружает все sub-views.

там хорошо она у тебя.

8 ответов


сделать что-то подобное ?

    NSLog(@"Navframe Height=%f",
        self.navigationController.navigationBar.frame.size.height);

версия swift является расположенном здесь


Свифт версия:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height

с iPhone-X высота верхней панели (панель навигации + строка состояния) изменяется (увеличивается).

попробуйте это, если вы хотите точную высоту верхней панели (как панель навигации и статус бар):

С

CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height +
       (self.navigationController.navigationBar.frame.size.height ?: 0.0));

Swift 4

let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
        (self.navigationController?.navigationBar.frame.height ?? 0.0)

для удобства попробуйте это расширение UIViewController

extension UIViewController {

    /**
     *  Height of status bar + navigation bar (if navigation bar exist)
     */

    var topbarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

Swift 3

let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)

вы пробовали это?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0

UIImage*image = [UIImage imageNamed:@"logo"];

float targetHeight = self.navigationController.navigationBar.frame.size.height;
float logoRatio = image.size.width / image.size.height;
float targetWidth = targetHeight * logoRatio;

UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
// X or Y position can not be manipulated because autolayout handles positions.
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth) / 2 , (self.navigationController.navigationBar.frame.size.height - targetHeight) / 2 , targetWidth, targetHeight)];
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)];
self.navigationItem.titleView = logoView;

// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/
[logoView setContentMode:UIViewContentModeScaleAspectFit];

/* Autolayout constraints also can not be manipulated since navigation bar has  immutable constraints
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false;

NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]};
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView};

[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]];
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]];

NSLog(@"%f", self.navigationItem.titleView.width );
*/

Так что все, что нам действительно нужно, это

UIImage*image = [UIImage imageNamed:@"logo"];
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)];
[logoView setContentMode:UIViewContentModeScaleAspectFit];

self.navigationItem.titleView = logoView;

лампочки стали. К сожалению, я не нашел единого способа исправить проблему, как описано ниже.

Я считаю, что вся моя проблема сосредоточена на моих авторезизирующих масках. И причина, по которой я пришел к выводу, что те же симптомы существуют, С или без UIWebView. И этот симптом в том, что для портрета все идеально. Для ландшафта самый нижний UIButton всплывает за полосой табуляции.

например, на одном UIView, I есть, сверху вниз:

UIView - оба набора пружин (случай по умолчанию) и без стоек

UIScrollView - Если я устанавливаю две пружины и очищаю все остальное (например, UIView), то UIButton вторгается в объект непосредственно над ним. Если я все очищу, то UIButton в порядке, но материал на самом верху скрывается за панелью состояния Устанавливающ только верхнюю распорку, UIButton хлопает вниз за вкладкой Бар.

UILabel и UIImage следующий вертикально-верхний набор стоек, гибкий везде

просто, чтобы завершить картину для немногих, которые имеют UIWebView:

UIWebView - Распорки: верхняя, левая, правая Пружины: оба

UIButton - ничего не установлено, т. е. гибко везде

хотя моя лампочка тусклая, кажется, есть надежда.


вот начало моего ответа на ваше уточнение:

Почему высота содержимого моего UIWebView не изменяется с вращением?.

может быть, потому, что ваш авто размер не имеет autoresizingMask по всем направлениям?

еще одно предложение, прежде чем я вернусь для этого, не могли бы вы использовать панель инструментов для ваших нужд. Это немного проще, всегда будет внизу, автоматически вращается/позиционируется. Вы можете Скрыть / показать его по желанию так далее. Примерно так: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

вы, возможно, смотрели на этот вариант, но просто бросали его там.

другая идея, не могли бы вы определить, какую ориентацию вы вращаете, и просто поместите кнопку программно, чтобы настроить для панели вкладок. (Это возможно с помощью кода)


следующее работало для меня, что включает высоту строки состояния, будь то строка состояния видимой или скрытой в любой ориентации:

UIViewController.topLayoutGuide.length