2012-08-10 5 views
4

Я пытаюсь создать пользовательский интерфейс с UINavigationController, который представляет некоторый UIViewController с дочерним UIViewController в виде боковой панели. В Пейзажной ориентации он должен быть полосой с правой стороны. При вращении к портрету он должен оставаться на той физической стороне, в то время как UINavigationController авторотирует и все остальное с ним. Таким образом, в портретной ориентации боковая панель становится узким местом.Как сделать одно пребывание UIView в фиксированном положении, в то время как все остальные авторотаты?

Посмотрите на макет, пожалуйста. UI Mockup

Теперь, как это сделать? Возвращение NO для shouldAutorotateToInterfaceOrientation:interfaceOrientation: не останавливает вращение этой боковой панели: -/

ответ

1
CGAffineTransform t; 
//You have to caculate the angel of view controller rotating  
CGFloat rotateAngel = M_PI/2;//replace 'M_PI/2' with your view controllers rotation angel 
t = CGAffineTransformMakeRotation(-rotateAngel); 
[view setTransform:t]; 
+0

Эти решения не работают. Я попробовал много кода преобразования, чтобы он выглядел как на месте. – leberwurstsaft

2

Изменить рамку и/или преобразование представления в методе обнаружения авторотации контроллера представления, что-то вроде этого:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)to duration:(NSTimeInterval)duration 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:duration]; 

    // Calculate the new frame and rotation angle of the view 
    // e. g.: 

    if (UIInterfaceOrientationIsPortrait(to)) { 
     theView.frame = CGRectMake(0, 924, 768, 100); 
     theView.transform = CGAffineTransformIdentity; 
    } else { 
     theView.frame = CGRectMake(924, 0, 100, 768); 
     theView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    } 

    [UIView commitAnimations]; 
} 
+0

Нет, это не оно. Пока он приближается к желаемой конечной ситуации, он оживляет панель по всему экрану, чтобы попасть туда. Вместо этого я бы хотел, чтобы представление просто не перемещалось нигде (соответственно, чтобы оно выглядело так, как будто оно не двигалось, поскольку он определенно должен противостоять автоматическим преобразованиям, которые делает контроллер) – leberwurstsaft

+0

@leberwurstsaft затем сделать его образ , Это единственное разумное решение. –

+0

Как бы это отличалось от анимации UIView? Это представление не является статичным, оно содержит subviews. И, строго говоря, он должен не просто оставаться на своем месте, а расширять свою длину до полной ширины содержащего вида в портрете и обратно до высоты содержащего представления в ландшафте. Таким образом, есть немного изменения размера. Но положение должно быть зафиксировано относительно экрана. – leberwurstsaft

1

Возможно ли отделить вид сбоку от вида контроллера навигации (не делайте его дочерним). Таким образом, у вас больше контроля над вращением. В любом случае вы можете повернуть изображения внутри представления.

+0

Я тоже пробовал это, установка была: Внешний контроллер, который имеет контроллер навигации в качестве дочернего элемента и подзаголовок, который не должен вращаться. Я установил внешний контроллер для автоматического поворота, а представленные контроллеры в навигационном контроллере автоматически вращаются, но затем все остановилось автоматически. Когда внешний (родительский) контроллер настроен на автоматический поворот, он будет вращать их все. Итак, нет, это не работает, к сожалению. – leberwurstsaft

+1

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

+0

Правильно, это именно то, к чему я согласился, поскольку я не мог заставить его работать. Но это нехорошо, и мне не нравится, что, похоже, нет реального решения. Я надеялся, что что-то пропустил. Теперь мне нужно вручную изменить положение, изменить размер, анимировать представление, чтобы оно не выглядело как осел во время вращения. Но спасибо вам в любом случае! – leberwurstsaft

1

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

В качестве альтернативы вы можете сначала сместить вид (когда вы получите willRotateToInterfaceOrientation), а затем верните его обратно в правильной ориентации, когда вы получите didRotateFromInterfaceOrientation.

+0

Да, решение для скольжения/выцветания - это то, что я делаю сейчас, так как это просто не сработает. Однако само по себе это не стоит того, чтобы справиться с этой задачей. Я просто подумал, что в этом случае это принесет приятное поведение, но не повезло. – leberwurstsaft

+0

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

+0

Внутри вращающегося основного вида есть гораздо больше, что зависит от автоматического поворота, я не думаю, что он сводится к этим двум операциям. – leberwurstsaft

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

  • Нет связанных вопросов^_^