2013-04-18 2 views
0

Я добавляю UIDatepicker к UIViewController, который является корневым элементом UINavigationController, и я использую этот код для размещения Datepicker в нижней части экрана.Subview неправильно расположен

UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 216, 320, 216)]; 
[self.view addSubview:picker]; 

Это обычно должно размещать сборщик точно в нижней части экрана, но он находится на расстоянии 44p. Навигационная панель ровно равна 44p, поэтому я думаю, что это проблема, но я не знаю, почему высота кадра включает в себя высоту навигационной панели, когда она не действует как Subview.

Я знаю, что простой способ - вычесть 44, но я ищу решение без каких-либо фиксированных чисел. Есть ли способ реализовать его, и кто-то может объяснить мне, почему представление включает в себя высоту навигатора?

ответ

1

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

Ex:

self.navigationControllerInstance.navigationBar.translucent = YES; 
+0

Хорошо, это решило проблему, но я действительно не знаю почему. ;) – digga

+0

Что делать, если вы не хотите, чтобы он был полупрозрачным, но все же хотите позиционировать без магических чисел? Кажется, что это решение для побочных эффектов ... – bryanmac

+0

@bryanmac - Если вы не хотите, чтобы свойство полупрозрачного объекта было дано, вам нужно сделать высоту представления контроллера вида 960 (режим ipad i.e., 1004-44 portraite). Аналогичный расчет необходим и для iphone. Таким образом вы можете справиться с рамкой зрения для достижения этого требования. Но, конечно, прозрачное свойство является эффективным решением для этого, а не для установки рамки представления. –

0

Ну, я думаю, что, поскольку ваш UIViewController является корневым представлением UINavigationController, он неявно включает в себя навигационную панель на своих границах.

Чтобы получить свой кадр в программе, вы можете использовать:

CGRect navframe = [[self.navigationController navigationBar] frame];

0
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)]; 
[self.view addSubview:picker]; 

попробуйте это!

+0

Извините, это принесло мне тот же результат. Установка навигационной панели для транскулента решила ее. В любом случае спасибо ;) – digga

0

Лучше не печатать какие-либо размеры. Попробуйте этот код:

UIDatePicker *picker = [[UIDatePicker alloc] init]; 
CGRect pickerFrame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - CGRectGetHeight(picker.bounds), CGRectGetWidth(picker.bounds), CGRectGetHeight(picker.bounds)); 
[picker setFrame:pickerFrame]; 
[self.view addSubview:picker]; 

Он работает и не предполагает, что высота datepickers всегда 216. Это может измениться в будущих реализациях IOS, так что лучше, чтобы проверить размер во время выполнения.

0
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

Я думаю, это решит вашу проблему!

Смежные вопросы