Программная обработка поворота UIView

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

Чтобы иметь этот полупрозрачный вид поверх всего остального, я добавил в качестве подвида self.view.window. Весь код выглядит так:

-(void)housekeepDataBase{

    self.searchOptionsControl.hidden=TRUE;
    self.searchBar.hidden=TRUE;

    UIView *translucentView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.window.frame.size.width, self.view.window.frame.size.height)];
    translucentView.backgroundColor=[UIColor blackColor];
    translucentView.alpha=0.65;


    UILabel *activityLabel=[[UILabel alloc]initWithFrame:CGRectMake((self.view.center.x-140), (self.view.frame.size.width*0.75), 280, 20)];
    activityLabel.numberOfLines=1;
    activityLabel.textAlignment=UITextAlignmentCenter;
    activityLabel.font=[UIFont fontWithName:@"Arial" size:20.0];
    activityLabel.text=@"Cleaning up database";
    activityLabel.textColor=[UIColor whiteColor];
    activityLabel.backgroundColor=[UIColor clearColor];


    UILabel *activityLabel2=[[UILabel alloc]initWithFrame:CGRectMake((self.view.center.x-140), (self.view.frame.size.width*0.75+40), 280, 20)];    activityLabel2.numberOfLines=1;
    activityLabel2.textAlignment=UITextAlignmentCenter;
    activityLabel2.font=[UIFont fontWithName:@"Arial" size:16.0];
    activityLabel2.text=@"(It might take a while)";
    activityLabel2.textColor=[UIColor whiteColor];
    activityLabel2.backgroundColor=[UIColor clearColor];



    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    spinner.frame=CGRectMake((self.view.center.x-50), (self.view.frame.size.width*0.50), 100, 37);
    [spinner startAnimating];


    [self.view.window addSubview:translucentView];
    [self.view.window addSubview:spinner];
    [self.view.window addSubview:activityLabel];
    [self.view.window addSubview:activityLabel2];

// dealing with the DB

}

К сожалению, это приводит к тому, что эти представления (представление, счетчик и метки) не поворачиваются в соответствии с ориентацией устройства.

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

Любые идеи? Заранее спасибо!


person Marcal    schedule 03.07.2012    source источник


Ответы (1)


Установите autoresizingMask, например,

- (void)housekeepDataBase
{
    self.searchOptionsControl.hidden=TRUE;
    self.searchBar.hidden=TRUE;

    UIViewAutoresizing controlMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
    UIViewAutoresizing viewMask    = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    UIView *view   = self.navigationController.view;
    CGRect  frame  = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height);
    CGPoint center = CGPointMake(frame.size.width / 2.0, frame.size.height / 2.0);

    _containerView                   = [[UIView alloc] initWithFrame:frame];
    _containerView.autoresizingMask  = viewMask;

    UIView *translucentView          = [[UIView alloc] initWithFrame:frame];
    translucentView.backgroundColor  = [UIColor blackColor];
    translucentView.alpha            = 0.65;
    translucentView.autoresizingMask = viewMask;

    UILabel *activityLabel           = [[UILabel alloc] initWithFrame:CGRectMake((center.x-140), (frame.size.width*0.75), 280, 20)];
    activityLabel.numberOfLines      = 1;
    activityLabel.textAlignment      = UITextAlignmentCenter;
    activityLabel.font               = [UIFont fontWithName:@"Arial" size:20.0];
    activityLabel.text               = @"Cleaning up database";
    activityLabel.textColor          = [UIColor whiteColor];
    activityLabel.backgroundColor    = [UIColor clearColor];
    activityLabel.autoresizingMask   = controlMask;

    UILabel *activityLabel2          = [[UILabel alloc] initWithFrame:CGRectMake((center.x-140), (frame.size.width*0.75+40), 280, 20)];
    activityLabel2.numberOfLines     = 1;
    activityLabel2.textAlignment     = UITextAlignmentCenter;
    activityLabel2.font              = [UIFont fontWithName:@"Arial" size:16.0];
    activityLabel2.text              = @"(It might take a while)";
    activityLabel2.textColor         = [UIColor whiteColor];
    activityLabel2.backgroundColor   = [UIColor clearColor];
    activityLabel2.autoresizingMask  = controlMask;

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    spinner.frame                    = CGRectMake((center.x-50), (frame.size.width*0.50), 100, 37);
    spinner.autoresizingMask         = controlMask;
    [spinner startAnimating];

    [view addSubview:_containerView];
    [_containerView addSubview:translucentView];
    [_containerView addSubview:spinner];
    [_containerView addSubview:activityLabel];
    [_containerView addSubview:activityLabel2];

    // dealing with the DB
}

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

- (void)removeHousekeepDataBase
{
    [_containerView removeFromSuperview];
    _containerView = nil;
}
person Rob    schedule 03.07.2012
comment
Я пробовал уже, но не работает. Спасибо за мысль, хотя. - person Marcal; 04.07.2012
comment
@Marcal Если вы добавите свои представления в self.view вместо self.view.window, я думаю, вы обнаружите, что он будет нормально обрабатывать события вращения. Я поместил ваш код в свое приложение в качестве теста с этим изменением (self.view), и он работает для меня. Я предполагаю, что в остальном ваше вращение работает нормально, и что это всего лишь вопрос размещения этих элементов управления и их автоматической настройки при переориентации. - person Rob; 04.07.2012
comment
Спасибо за объяснение. Проблема, которую я вижу, добавляя представления в self.view, заключается в том, что полупрозрачное представление не покрывает весь экран. Например, отсутствует панель навигации. - person Marcal; 04.07.2012
comment
@Marcal Как насчет self.navigationController.view? Это работает для меня, покрывая и панель навигации. - person Rob; 04.07.2012
comment
Вау, именно то, что я искал. Хороший звонок! Теперь работает хорошо (хотя мне нужно настроить autoresizingMask). В любом случае, я не был доволен добавлением subview непосредственно в self.view.window. Большое спасибо! - person Marcal; 04.07.2012
comment
@Marcal Полупрозрачный вид должен быть UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight. Ярлыки и счетчик должны быть UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin - person Rob; 04.07.2012
comment
@Marcal Измененный ответ с концепцией представления контейнера (так что вы можете удалить все эти элементы управления, просто удалив одно представление). - person Rob; 04.07.2012
comment
Мне становится странно, когда вы запускаете приложение в ландшафтном режиме. Полупрозрачный вид занимает примерно 75% ширины экрана (слева направо). - person Marcal; 04.07.2012
comment
@Marcal Вы используете UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight для полупрозрачного вида? Вы хотите, чтобы он масштабировался вместе с окном (тогда как метки и счетчик вы хотите, чтобы поля масштабировались, следовательно, UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin). - person Rob; 04.07.2012
comment
Да, я действительно скопировал ваш код. Это похоже на разделенное представление, но мастер находится на правой стороне. - person Marcal; 04.07.2012
comment
@Marcal Не уверен, понимаю ли я, что вы описываете. Это айфон, да? или айпад? А вы видите проблемный пейзаж или портрет? Возможно, вы также можете предоставить снимок экрана. - person Rob; 05.07.2012
comment
это iPad, и проблема появляется только тогда, когда приложение запускается из ландшафтного режима. Странно, да? - person Marcal; 05.07.2012
comment
@Marcal Вы можете попробовать self.splitViewController.view вместо self.navigationController.view. - person Rob; 05.07.2012
comment
да, я думал об этом, но это не работает, потому что у меня нет никакого splitViewController. Это не имеет значения, я думаю, что я оставлю его как невращающийся экран. В любом случае это одноразовая вещь. Происходит только при первом запуске приложения. - person Marcal; 05.07.2012