it-swarm.com.ru

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

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

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

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


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

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

Например, на одном UIView, я имею сверху вниз:

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

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

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

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

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

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

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


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

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

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

Итак, UIImage, текст и т.д. UIWebView (на НЕКОТОРЫХ) UIButton

Все вышеперечисленное окружает UIScrollView.

2) Для тех, у кого есть UIWebView, его autoresizingMask выглядит так:

   —
   |
   —

   ^
   |
   |

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

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

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

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

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

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

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

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

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

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

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

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

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

Без UIWebView я оставляю все как есть у IB.

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

Ну, вот и все.

111
John Love

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

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

Например, на одном UIView, я имею сверху вниз:

IView - установлены обе пружины (по умолчанию) и нет распорок

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

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

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

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

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

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

1
John Love

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

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

Версия Swift находится здесь

232
Sum

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

Попробуйте это, если вам нужна точная высота верхней панели (обе панели навигации + строка состояния):

Objective-C

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

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

Swift версия:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
56
King-Wizard

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

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
6
Keaz
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;
4
ironik sütlaç

У моего приложения есть пара представлений, для отображения которых требовалась настраиваемая панель навигации в пользовательском интерфейсе, однако без контроллера навигации. И приложение должно поддерживать версию iOS до iOS 11, поэтому удобное руководство по разметке безопасной области не могло быть использовано, и мне пришлось программно регулировать положение и высоту навигационной панели.

Я прикрепил панель навигации к ее суперпредставлению напрямую, пропустив руководство по макету безопасной области, как упомянуто выше. И высоту строки состояния можно легко получить из UIApplication, но высота панели навигации по умолчанию действительно мучительная ...

Я почти пол ночи провел с поиском и тестированием, пока я, наконец, не получил подсказку из другого поста (хотя и не работал для меня), что вы можете получить высоту из UIView.sizeThatFits (), вот так :

- (void)viewWillLayoutSubviews {
    self.topBarHeightConstraint.constant = [UIApplication sharedApplication].statusBarFrame.size.height;
    self.navBarHeightConstraint.constant = [self.navigationBar sizeThatFits:CGSizeZero].height;

    [super viewWillLayoutSubviews];    
}

Наконец, идеальная панель навигации выглядит точно так же, как встроенная!

1
Stephen Liu

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

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

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

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

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

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

1
Sum