2013-12-22 3 views
0

У меня есть представление, которое должно иметь разное расположение в портретном и ландшафтном режимах. Я реализовать метод, чтобы перерисовать мои элементы пользовательского интерфейса с Autosizing (без AutoLayout):Столбец не выбирается после вращения

-(void)buildViewElements:(UIInterfaceOrientationMask)interfaceOrientation duration:(NSTimeInterval)duration { 
if (interfaceOrientation == UIInterfaceOrientationMaskPortrait) { 
    NSLog(@"Portrait"); 

    [UIView animateWithDuration:duration animations:^{ 
     CGRect newImageFrame = CGRectMake(20, 15, 100, 100); 
     _personImage.frame = newImageFrame; 
     CGRect newNameLabelFrame = CGRectMake(128, 20, 172, 21); 
     _nameLabel.frame = newNameLabelFrame; 
     CGRect newNameDescFrame = CGRectMake(128, 41, 172, 21); 
     _nameDescriptionLabel.frame = newNameDescFrame; 
     CGRect newBorrowedFrame = CGRectMake(128, 64, 75, 21); 
     _borrowedLabel.frame = newBorrowedFrame; 
     CGRect newBorrowedValueFrame = CGRectMake(211, 64, 42, 21); 
     _borrowedValueLabel.frame = newBorrowedValueFrame; 
     CGRect newLendFrame = CGRectMake(128, 93, 75, 21); 
     _lendLabel.frame = newLendFrame; 
     CGRect newLendValueFrame = CGRectMake(211, 93, 42, 21); 
     _lendValueLabel.frame = newLendValueFrame; 

     CGRect newcontainerFrame = CGRectMake(0, 130, 320, [CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] - 194); 
     _tableContainerView.frame = newcontainerFrame; 
     CGRect newDetailFrame = CGRectMake(20, 0, 280, 29); 
     _detailSelector.frame = newDetailFrame; 
     CGRect newTableFrame = CGRectMake(0, 36, 320, newcontainerFrame.size.height - 39); 
     _tableView.frame = newTableFrame; 
    }]; 
} 
else if (interfaceOrientation == UIInterfaceOrientationMaskLandscape) { 
    NSLog(@"Landscape"); 

    [UIView animateWithDuration:duration animations:^{ 
     CGFloat factor = 1.0f; 
     CGFloat diff = 0.0f; 
     if ([CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] <= 480) { 
      // iPhone4 size 
      factor = 0.8f; 
      diff = 10.0f; 
     } 

     CGRect newImageFrame = CGRectMake(75*factor-diff, 20, 100, 100); 
     _personImage.frame = newImageFrame; 
     NSLog(@"Bild Frame %f", newImageFrame.origin.x); 
     CGRect newNameLabelFrame = CGRectMake(20, 140, 210*factor, 21); 
     _nameLabel.frame = newNameLabelFrame; 
     CGRect newNameDescFrame = CGRectMake(20, 161, 210*factor, 21); 
     _nameDescriptionLabel.frame = newNameDescFrame; 
     CGRect newBorrowedFrame = CGRectMake(20, 184, 75, 21); 
     _borrowedLabel.frame = newBorrowedFrame; 
     CGRect newBorrowedValueFrame = CGRectMake(103, 184, 42, 21); 
     _borrowedValueLabel.frame = newBorrowedValueFrame; 
     CGRect newLendFrame = CGRectMake(20, 213, 75, 21); 
     _lendLabel.frame = newLendFrame; 
     CGRect newLendValueFrame = CGRectMake(103, 213, 42, 21); 
     _lendValueLabel.frame = newLendValueFrame; 

     CGRect newContainerFrame = CGRectMake(250*factor, 0, [CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] - 250*factor, 268); 
     _tableContainerView.frame = newContainerFrame; 
     CGRect newDetailFrame = CGRectMake(20, 10, newContainerFrame.size.width - 40 , 29); 
     _detailSelector.frame = newDetailFrame; 
     CGRect newTableFrame = CGRectMake(0, 49, newContainerFrame.size.width, 219); 
     _tableView.frame = newTableFrame; 
    }]; 
} 

}

Этот метод вызывается из метода:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

switch (toInterfaceOrientation) { 
    case UIInterfaceOrientationPortrait: 
     [self buildViewElements:UIInterfaceOrientationMaskPortrait duration:duration]; 
     break; 
    case UIInterfaceOrientationPortraitUpsideDown: 
     [self buildViewElements:UIInterfaceOrientationMaskPortrait duration:duration]; 
     break; 
    case UIInterfaceOrientationLandscapeLeft: 
     [self buildViewElements:UIInterfaceOrientationMaskLandscape duration:duration]; 
     break; 
    case UIInterfaceOrientationLandscapeRight: 
     [self buildViewElements:UIInterfaceOrientationMaskLandscape duration:duration]; 
     break; 
    default: 
     break; 
} 

}

Метод getLargestAttributeOfSize : возвращает атрибут наибольшего размера (высота или ширина).

Если я начну просмотр в портрете, я могу отобразить ячейки таблицы и метод tableView: вызывается метод didSelectRowAtIndexPath:. После поворота в альбомный режим все ячейки не могут быть выбраны, и я не могу прокручивать их в таблице. Но, если я выложу этот экран и снова вызову ist (в ландшафтном режиме), можно выбрать одни и те же ячейки таблицы, вызывается метод и я могу прогуливаться по таблице. Если я поворачиваю устройство на портрет, у меня такое же ошибочное поведение. После поворота моего устройства я не могу взаимодействовать с моей таблицей и ее ячейками.

Может кто-нибудь помочь мне, пожалуйста, или у меня есть идея, в чем моя проблема? Спасибо!

ответ

1

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

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

+0

Если я установил этот флаг в свой супер-просмотр _tableContainerView, таблица больше не видна. Поэтому я предполагаю, что проблема с моим контейнером. Теперь я ищу причину, но ничего не могу найти. Я сравнивал отскоки и рамки моего контейнера и табличного представления, но он выглядит так, как ожидалось. – Thomas

+0

Можете ли вы опубликовать образец проекта со всеми этими представлениями и некоторыми фиктивными данными? – Erik

+0

ОК, я нашел свою проблему - автозащитные маски. Метод willRotateToInterfaceOrientation: выполняется до того, как устройство вращается. Таким образом, все элементы находятся в правильном положении. Теперь устройство вращается, и моя маска автообновления изменяет элементы для новой ситуации. К сожалению, мой контейнерный вид очень маленький. Спасибо за ответы! – Thomas

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