Модный просмотр iPhone Меньше, чем экран
Я пытаюсь сделать что-то, что не должно быть так сложно, но я не могу понять.
У меня есть UIViewController, отображающий UITableView. Я хочу представить контекстное меню, когда пользователь нажимает на строку. Я хочу, чтобы это полупрозрачное изображение с ярлыками и кнопками.
Я мог бы использовать AlertView, но я хочу полностью контролировать формат ярлыков и кнопок и хотел бы использовать Interface Builder.
Итак, я создал свое маленькое представление 250x290, установил альфа-формат .75 и создал контроллер представления с выходами для обработки различных пользовательских событий.
Теперь я хочу представить его.
Если я использую presentModalViewController, возникают две (нежелательные) вещи
1) вид охватывает весь экран (но строка состояния).
2) Он полупрозрачен, но я вижу "позади" его не родительский вид, а корневой вид приложений.
Ive попробовал добавить его как подвью, но ничего не происходит, поэтому я ничего не делаю правильно:
RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];
Можно ли делать то, что я хочу?
Спасибо заранее.
Gonso
Ответы
Ответ 1
Я кодирую подобную вещь. Мой подход включает в себя.....
-
Не использовать функцию offsetModalViewControllerAnimated и presentModalViewController: анимированный.
-
Создайте индивидуальный полноразмерный вид в IB. В своем телеобъекте viewDidLoad установите цвет фона clearColor, чтобы пространство в представлении, не охватываемом контроллерами, было прозрачным.
-
Я установил UIImageView под контроллерами плавающего представления. UIImageView содержит изображение с фотошопом, которое имеет закругленные углы, а фон установлен на прозрачный. Этот образ представляет собой контейнер.
-
Я использую CoreAnimation для представления/отклонения плавающего представления в стиле модального вида: (FloatingViewController.m)
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor clearColor]];
[UIView beginAnimations:nil context:nil];
[self.view setFrame:CGRectMake(0, 480, 320, 480)];
[UIView setAnimationDuration:0.75f];
[self.view setFrame:CGRectMake(0, 0, 320, 480)];
[UIView commitAnimations];
}
Ответ 2
wangii
Это в значительной степени решение, которое я нашел.
Я загружаю представление с помощью loadNibNamed, а затем просто добавляю его сверху с помощью addSubView, например:
//Show a view on top of current view with a wait indicator. This prevents all user interactions.
-(void) showWaitView{
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"WaitView" owner:self options:nil];
#ifdef __IPHONE_2_1
waitView = [ nibViews objectAtIndex: 0];
#else
waitView = [ nibViews objectAtIndex: 1];
#endif
CGFloat x = self.view.center.x - (waitView.frame.size.width / 2);
CGFloat y = self.view.center.y - (waitView.frame.size.height / 2);
[waitView setFrame:CGRectMake(x,y,waitView.bounds.size.width,waitView.bounds.size.height)];
[self.view addSubview:waitView];
}
Не могли бы вы рассказать о точках 3 и 4?
То, что я сделал, чтобы рассмотреть круглый прямоугольный аспект, помещается в круглую прямоугольную кнопку.
Этот код фактически позволит вам иметь небольшой плавающий вид, но если представление меньше его родителя, пользователь может взаимодействовать с видимой частью родителя.
В конце я создаю свое представление того же размера, но на всякий случай сохраняю код.
Gonso
Ответ 3
Я бы настоятельно подумал о том, чтобы использовать навигационный контроллер для слайда в вашем подвью, вместо того, чтобы накладывать его. Это ожидаемая модель и любая небольшая выгода, которую вы, возможно, думаете, что получите, сделав это по-своему, будет значительно компенсирована принципом (наименьшего) удивления.
Если вам действительно нужно это сделать, я считаю, что трюк заключается в том, чтобы добавить первый вид таблицы в качестве подсмотра прозрачного "удерживающего" представления, которое поддерживает контроллер просмотра. Затем добавьте ваш новый под просмотр в качестве другого подзадача.
Ответ 4
Опять же, если вы действительно хотите это сделать, вместо добавления прозрачного "удерживающего" представления, поскольку это всплывающее окно по существу модально, я бы сделал его подвью прямо из окна.
Возможно, вы захотите установить прозрачный черный экран, чтобы не допустить касания фона и фокуса ввода всплывающего окна.
Но если серьезно, подумайте о том, чтобы либо добавить контроллер в стек, либо использовать это предупреждение. Если вы не наняли конструктора $$, он, вероятно, не будет выглядеть соответствующим на iPhone.
Ответ 5
То, что я сделал, это создать UIViewController поверх моего контроллера UINavigation в моем делете приложения и сделать его одним из объектов Singleton для удобства:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//--- create root navigation controller
self.window.rootViewController = self.navigationController;
//--- create view controller for popups:
popupViewController = [[BaseViewController alloc] init];
popupViewController.view.backgroundColor = [UIColor clearColor];
popupViewController.view.hidden = true; //for rendering optimisation
[self.window addSubview:popupViewController.view];
[AppState sharedInstance].popupViewController = self.popupViewController;
//--- make all visible:
[self.window makeKeyAndVisible];
return YES;
}
В любой момент моего приложения я могу позвонить, например.
MyViewController * myVC = [[UIViewController alloc] init];
//... set up viewcontroller and its view...
// add the view of the created view controller to the popup view:
[AppState sharedInstance].popupViewController.view.hidden = false;
[[AppState sharedInstance].popupViewController.view addSubview:myVC.view];
BaseViewController, используемый сверху, просто наследует от UIViewController и настраивает полноэкранный режим:
//----- in BaseViewController implementation
- (void)loadView {
//------- create root view:
CGRect frame = [[AppState sharedInstance] getScreenFrame];
rootView = [[VCView alloc] initWithFrame:frame];
rootView.backgroundColor = [UIColor whiteColor];
self.view = rootView;
}