我升级到xCode 4.2,它是新的Storyboards功能。然而,找不到支持肖像和风景的方法。
当然,我是以编程方式完成的,有2个视图,一个用于纵向,一个用于横向,就像过去一样,并且:
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
self.view = self.landscapeView;
}
else
{
self.view = self.portraitView;
}
但我正在寻找一种方法以某种方式自动执行此操作。我的意思是,现在是xCode 4.2,我期待更多。谢谢大家。
==================================
临时解决方案:
我将在这里提出一个临时解决方案。我说这是暂时的,因为我还在等苹果公司做一些非常聪明的事情。
我创建了另一个.storyboard文件,名为“MainStoryboard_iPhone_Landscape”,并在那里实现了横向视图控制器。实际上,它与普通(肖像)。存储板完全一样,但所有屏幕都处于横向模式。
所以我将从横向故事板中提取ViewController,当轮换发生时,只需使用新的viewController视图更改self.view。
1.方向更改时生成通知:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
2.寻找通知:
[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
// We must add a delay here, otherwise we'll swap in the new view
// too quickly and we'll get an animation glitch
[self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];
3.Implement updateLandscapeView
- (void)updateLandscapeView {
//> isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
MDBLogin *loginVC_landscape = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
appDelegate().isShowingLandscapeView = YES;
[UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
//> Setup self.view to be the landscape view
self.view = loginVC_landscape.view;
} completion:NULL];
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
MDBLogin *loginVC = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
appDelegate().isShowingLandscapeView = NO;
[UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
//> Setup self.view to be now the previous portrait view
self.view = loginVC.view;
} completion:NULL];
}}
祝大家好运。
P.S:我会接受Ad Taylor的回答,因为经过很长时间等待并寻找解决方案之后,我最终实现了一些灵感来自他的回答。谢谢Taylor。
答案 0 :(得分:6)
这是一个老问题,但我在当天早些时候读到这个问题,然后不得不花费相当多的时间来制定更好的解决方案。我通过攻击Apple Alternate View example来提出这个解决方案。基本上它正在为景观视图提供模态视图。
#pragma mark Rotation view control
- (void)orientationChanged:(NSNotification *)notification
{
// We must add a delay here, otherwise we'll swap in the new view
// too quickly and we'll get an animation glitch
[self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}
- (void)updateLandscapeView
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
{
[self performSegueWithIdentifier: @"toLandscape" sender: self];
self.isShowingLandscapeView = YES;
}
else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
{
[self dismissModalViewControllerAnimated:YES];
self.isShowingLandscapeView = NO;
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
答案 1 :(得分:3)
你通常不应该考虑不同方向的不同观点,除非它们有很大的不同(可以说,它们不应该是)。相反,当superview的框架发生变化时,你应该依靠autoresizing masks根据基本限制来布置你的视图内容。这将允许子视图对其超级视图框架中的更改做出适当响应,通常是由于界面方向更改。
更直接地回答你的问题,不,Xcode没有办法假设或被告知你想要用于特定界面方向的视图,因为这绝不是UIKit
视图架构的意图
以下是有关自动调整蒙版的更多信息:Handling Layout Changes Automatically Using Autoresizing Rules。
答案 2 :(得分:3)
在XCode v4.2.1中使用StoryBoards时,你只能改变视图控制器的方向,而不能改变视图本身,所以如果你在那里插入了另一个视图,你将无法改变它的方向,即使你可以正确地看到视图。
因此,当使用StoryBoards时(使用NIB时,单独的视图可以更改视图方向),以前使用两个视图的方式似乎不起作用。