iPhone UIViewController переходит под строку состояния
У меня есть UIView
и UIController
Посмотреть. Мой стандартный вид 320x460. В applicationDidFinishLaunching
Я делаю:
[window addSubview:[controller view]];
Странная вещь в том, что UIView
идет под строкой состояния (как будто отсутствует розетка). Однако, если я поверну iPhone в сторону, а затем вернусь, он появится нормально.
Это ожидаемое поведение (держу пари, я могу это исправить, установив смещение) или я что-то делаю неправильно?
12 ответов
Я думаю, что ваша проблема в том, что когда вы добавляете представление в окно, вам необходимо знать о состоянии строки состояния и компенсировать это:
if showing the status bar :
[controller view].frame = CGRectMake(0, **20**, 320, 460);
else
[controller view].frame = CGRectMake(0, 0, 320, **480**);
Вот почему IB показывает вам пустую строку состояния.
Я столкнулся с этой проблемой при отображении UIViewController через presentModalViewController.
Вы можете обойти это, вручную изменяя размер представления контроллера после того, как представление появилось:
- (void) viewDidAppear: (BOOL) animated {
//manually adjust the frame of the main view to prevent it from appearing under the status bar.
UIApplication *app = [UIApplication sharedApplication];
if(!app.statusBarHidden) {
[self.view setFrame:CGRectMake(0.0,app.statusBarFrame.size.height, self.view.bounds.size.width, self.view.bounds.size.height - app.statusBarFrame.size.height)];
}
}
Я добавляю эту проблему сегодня. Оказалось, что я проверял "Wants Full Screen" в инспекторе атрибутов ViewController.
Отключение "Wants Full Screen" решило проблему.
Исправления в окне не работали для меня, так как у меня был модальный вид. Модальное представление UIModalPresentationCurrentContext. Хорошо, вот что сработало для меня. Я искал в Интернете, прежде чем заставить это работать. Я не могу переместить view.frame от родителя. Однако в viewWillAppear я могу переместить его вниз:
- (void)viewWillAppear:(BOOL)animated
{
// Move down to compensate for statusbar
CGRect frame = parentView.navCon.view.frame;
frame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height;
parentView.navCon.view.frame = frame;
}
Наконец-то я дошел до этого решения. Хорошо работает как для iPhone, так и для iPad:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Allocate view controller and load nib file
if (isIPhone) {
self.mainViewController = [[[tfdMainViewController_iPhone alloc] initWithNibName:@"tfdMainViewController_iPhone" bundle:nil] autorelease];
} else {
self.mainViewController = [[[tfdMainViewController_iPad alloc] initWithNibName:@"tfdMainViewController_iPad" bundle:nil] autorelease];
}
// Offset correction (iPhone bug?)
CGRect r = self.mainViewController.view.frame;
r = CGRectOffset(r, 0, [UIApplication sharedApplication].statusBarFrame.size.height);
[self.mainViewController.view setFrame:r];
[window addSubview: self.mainViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
PS Почему-то вид имеет правильную высоту: 480 (высота экрана в портретном режиме iPhone) - 20 (строка состояния) = 460, но не удалось установить вертикальное смещение. Это довольно странное поведение, похоже на ошибку.
Если вы используете "Симулированные элементы интерфейса" Интерфейсного Разработчика, то вам также необходимо убедиться, что вы установили флаг "Изменить размер представления из NIB" в вашем перо MainWindow.
Это похоже на ошибку в iOS 5. Одним из исправлений будет использование wantsFullScreenLayout
в любом представлении контроллер должен представлять модально и вручную макет представления всегда ниже строки состояния.
Решение Xcode 6, iOS7/8 предназначено для снятия флажка "Under Top Bars" в разделе "Extend Edges" раздела View Controller инспектора атрибутов.
Даже у меня тоже есть та же проблема. Когда мы используем некоторое кодирование для ориентации устройства, мы записали некоторое кодирование в делегат приложения или в наш контроллер представления. Там нам нужно изменить условие, чтобы использовать ориентацию возврата ДА или НЕТ. Это решило нашу проблему.
Для Xamarin.iOS это будет:
if (UIApplication.SharedApplication.StatusBarHidden == false)
{
var statusBarHeight = UIApplication.SharedApplication.StatusBarFrame.Height;
View.Frame = new CoreGraphics.CGRect(0, statusBarHeight, View.Frame.Width, View.Frame.Height - statusBarHeight);
}
Я предпочитаю использовать UINavigationController, чтобы обернуть UIViewController, после чего вы установите NavigationBarHidden для UINavigationController. Это идеальное решение, потому что UINavigationController обрабатывает высоту строки состояния в iOS 7.
Вот мой код и мой снимок экрана.
UINavigationController *wrapNavController = [[UINavigationController alloc] initWithRootViewController:yourViewController] ;
[wrapNavController setNavigationBarHidden:YES] ;
Вы вручную устанавливаете скрытое свойство панели приложения ПОСЛЕ добавления подпредставления? Я не представляю, что это так, но если при первой загрузке представления ему присвоено значение none, оно будет расположено так, как если бы его не было, а если затем установить строку состояния, чтобы она не была скрытой, она появится сверху. с вашей точки зрения.
Возможным решением является использование [[controller view] setNeedsLayout];
после добавления подпредставления или, возможно, [window layoutSubviews];
, У меня никогда не было большого успеха, используя их для решения проблем с макетом, но, поскольку он работает после поворота, его стоит попробовать.