2012-06-06 5 views
0

У меня есть viewController с 3 видами: topView, tableView и textView.Цель c - UIView autoresize in landscape

Я хочу, чтобы макет так:

в портретном режиме -

|---------------| 
| topView | 
|---------------| 
|    | 
|    | 
| tableView | 
|    | 
|    | 
|---------------|    
| textView | 
|---------------| 

в ландшафтном режиме:

|--------------------------| 
|   topView   | 
|--------------------------| 
|       | 
|  tableView   | 
|--------------------------|    
|  textView   | 
|--------------------------| 

И когда клавиатура вверх:

|---------------| 
|    | 
| tableView | 
|    | 
|---------------|    
| textView | 
|---------------| 
|    | 
| keyboard | 
|    | 
|---------------| 

|--------------------------| 
|  tableView   | 
|--------------------------|    
|  textView   | 
|--------------------------| 
|       | 
|  keyboard   | 
|--------------------------| 

(как вы можете увидеть вид сверху исчезает, когда клавиатура вверх)

код для этого является:

- (void)loadView 
{ 
    [super loadView]; 

    // load top view 
    _topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, TOP_VIEW_HEIGHT)]; 
    _topView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 
    _topView.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:_topView]; 

    // load table view (at the middle) 
    CGRect tableFrame = CGRectMake(0, TOP_VIEW_HEIGHT, self.view.bounds.size.width, self.view.bounds.size.height - TOP_VIEW_HEIGHT - TEXT_VIEW_HEIGHT); 
    _tableView = [[UITableView alloc] initWithFrame:tableFrame style:UITableViewStylePlain]; 
    _tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    _tableView.delegate = self; 
    _tableView.dataSource = self; 
    [self.view addSubview:_tableView]; 

    // load text view (at the bottom) 
    CGRect textViewFrame = CGRectMake(0, tableFrame.size.height + TOP_VIEW_HEIGHT, self.view.bounds.size.width, TEXT_VIEW_HEIGHT); 
    _textView = [[UITextView alloc] initWithFrame:textViewFrame]; 
    _textView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; 
    _textView.backgroundColor = [UIColor yellowColor]; 
    [self.view addSubview:_textView]; 
} 



- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 

    // Get animation info from userInfo 
    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 


    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 

    CGSize kbSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect textViewFrame = self.textView.frame; 
    textViewFrame.origin.y -= kbSize.height; 

    CGRect topViewFrame = self.topView.frame; 
    topViewFrame.origin.y -= topViewFrame.size.height; 

    CGRect tableFrame = self.tableView.frame; 
    tableFrame.origin.y -= topViewFrame.size.height; 
    tableFrame.size.height -= (kbSize.height - topViewFrame.size.height); 

    [UIView animateWithDuration:animationDuration delay:0.0 options:animationCurve animations:^{ 
     self.textView.frame = textViewFrame; 
     self.tableView.frame = tableFrame; 
     self.topView.frame = topViewFrame; 
    }completion:^(BOOL finished) { 

    }]; 
} 

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 

    // Get animation info from userInfo 
    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 


    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 

    CGSize kbSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect textViewFrame = self.textView.frame; 
    textViewFrame.origin.y += kbSize.height; 

    CGRect topViewFrame = self.topView.frame; 
    topViewFrame.origin.y += topViewFrame.size.height; 

    CGRect tableFrame = self.tableView.frame; 
    tableFrame.origin.y += topViewFrame.size.height; 
    tableFrame.size.height += kbSize.height - topViewFrame.size.height; 

    [UIView animateWithDuration:animationDuration delay:0.0 options:animationCurve animations:^{ 
     self.textView.frame = textViewFrame; 
     self.tableView.frame = tableFrame; 
     self.topView.frame = topViewFrame; 
    }completion:^(BOOL finished) { 
     // 
    }]; 
} 

Большинство из того, что я хочу хорошо работает, проблема, когда клавиатура показано в ландшафтном режиме, то все идет не так ..

Пожалуйста, обратите внимание мнения autoresizingMask недвижимость, потому что я не уверен, что я поставил его в данный момент.

ответ

1

Я нашел эту проблему, когда я сделал мнение, в вверх/вниз анимации в keyboardWillShow/willHide я не преобразовал клавиатуры прямоугольник с экрана, чтобы просмотреть координаты

CGRect kbRect = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]; 
kbRect = [self.view convertRect:kbRect fromView:nil]; 
CGSize kbSize = kbRect.size; 

Теперь это работает отлично :)

1

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

Также проверьте ориентацию в loadView так:

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 
    // do one layout 
} else { 
    // do another layout 
} 

Я делаю очень обычай работы вращения тоже в моем приложении (думаю, пользовательский разделить контроллер представления с нуля - гадость), и я это делаю используя willAutorotate и UIInterfaceOrientationIsLandscape.

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

+0

> есть ли у вас проблемы при открытии клавиатуры в ландшафте - ДА это проблема. Фактически это швы, что autoresizingmask достаточно, чтобы правильно раскрыть представление, поскольку я сказал, что проблема заключается в том, когда я открываю клавиатуру. Я просто заметил, что на ландшафте высота клавиатуры составляет 460?! – Eyal

+0

OK. Да, высота клавиатуры отличается от портрета и пейзажа. вы можете использовать функцию 'UIInterfaceOrientationIsLandscape' в методах' keyboardWillShow' и 'keyboardWillHide', чтобы определить, как развернуть представления. – aopsfan

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