iPhone Modal View Меньше, что экран - PullRequest
11 голосов
/ 27 мая 2009

Я пытаюсь сделать что-то, что не должно быть таким сложным, но я не могу понять это. У меня есть UIViewController, отображающий UITableView. Я хочу представить контекстное меню, когда пользователь нажимает на строку. Я хочу, чтобы это был полупрозрачный вид с метками и кнопками. Я мог бы использовать AlertView, но я хочу получить полный контроль над форматом надписей и кнопок и хотел бы использовать Interface Builder.

Итак, я создал свой маленький просмотр 250x290, установил альфа на 0,75 и создал контроллер представления с выходами для обработки различных пользовательских событий.

Теперь я хочу представить это. Если я использую presentModalViewController, происходят две (нежелательные) вещи 1) представление охватывает весь экран (кроме строки состояния). 2) Он полупрозрачен, но то, что я вижу «за», это не родительское представление, а корневое представление приложения.

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

RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];

Можно ли делать то, что я хочу? Заранее спасибо.

Gonso

Ответы [ 5 ]

11 голосов
/ 15 июня 2009

Я кодирую похожую вещь. Мой подход включает в себя .....

  1. Не используется dismissModalViewControllerAnimated and presentModalViewController: animated.

  2. Разработка персонализированного полноразмерного представления в IB. В теле сообщения viewDidLoad установите цвет фона на clearColor, чтобы пространство на представлении, не покрытом контроллерами, было прозрачным.

  3. Я поместил UIImageView под контроллерами плавающего вида. UIImageView содержит фотошоповое изображение, которое имеет закругленные углы, а фон установлен прозрачным. Этот вид изображения служит контейнером.

  4. Я использую 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];
    }
    
3 голосов
/ 16 июня 2009

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

2 голосов
/ 27 мая 2009

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

Если вам действительно нужно сделать это таким образом, я считаю, что хитрость заключается в том, чтобы добавить первое табличное представление как подпредставление прозрачного «удерживающего» представления, которое поддерживает контроллер представления. Затем добавьте свое новое подпредставление в качестве другого подпредставления этого.

1 голос
/ 03 августа 2011

Я создал UIViewController поверх моего контроллера UINavigation в моем делегате приложения и сделал для него свойство одноэлементного объекта:

- (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;
}
1 голос
/ 28 мая 2009

Опять же, если вы действительно хотите это сделать, вместо добавления прозрачного «удерживающего» представления, поскольку это всплывающее окно по сути модальное, я бы сделал его подпредставлением непосредственно из окна.

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

А если серьезно, рассмотрите возможность размещения контроллера в стеке или использования этого представления предупреждений. Если вы не наняли $$ дизайнера, он, вероятно, не будет выглядеть уместно на iPhone.

...