我正在iPad上开发这个应用程序。我的MainWindow包含一个Split View Controller,它可以加载RootViewController和DetailViewController 我有这个图像放在DetailViewController的右下角。 我的应用程序允许不同的方向,因此我希望图像出现在不同位置的不同位置。
这是我在DetailViewController中的代码:
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
myImage.frame = CGRectMake(183.0f, 257.0f, 548.0f, 447.0f);
}
else if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
myImage.frame = CGRectMake(244.0f, 518.0f, 548.0f, 447.0f);
}
}
当我启动我的应用程序并且我的iPad处于纵向时,图像将被正确放置在右下角的(X:244,Y:518)。 但是当我启动我的应用程序并且我的iPad处于横向时,图像将不会显示,我怀疑它仍处于纵向定位的位置。只有当我将iPad旋转到纵向然后再回到横向时,图像才会出现在(X:183,Y:257),这是正确的。
我试图将这些代码放在我的DetailViewController的'viewWillAppear'方法中:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
myImage.frame = CGRectMake(183.0f, 257.0f, 548.0f, 447.0f);
}
else if(self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
myImage.frame = CGRectMake(244.0f, 518.0f, 548.0f, 447.0f);
}
}
但是当我启动我的应用程序时,它仍然存在同样的问题。
我能做什么,当我第一次以横向方式启动我的应用程序时,它将被正确放置在(X:244,Y:518)?
答案 0 :(得分:2)
您可能希望尝试将调整大小逻辑放在didRotateFromInterfaceOrientation
而不是willRotateToInterfaceOrientation
中。
我的自定义布局代码只有在轮换完成后才调用它,而不是之前。
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
NSLog(@"didRotateFromInterfaceOrientation");
float width;
float height;
if ((fromInterfaceOrientation == UIInterfaceOrientationLandscapeRight) ||
(fromInterfaceOrientation == UIInterfaceOrientationLandscapeLeft))
{
width = [[UIScreen mainScreen] applicationFrame].size.width;
height = [[UIScreen mainScreen] applicationFrame].size.height;
NSLog(@"Changing to portrait: %f x %f", width, height);
}
else
{
width = [[UIScreen mainScreen] applicationFrame].size.height;
height = [[UIScreen mainScreen] applicationFrame].size.width;
NSLog(@"Changing to landscape: %f x %f", width, height);
}
NSLog(@"Changed orientation: %f x %f", width, height);
// Call my custom layout function to setFrame on all my UI controls
[self doLayout:width height:height];
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
如果您的应用显示状态栏,则可能需要拨打self.view.frame.size.width
,而不是从applicationFrame
获取尺寸。
答案 1 :(得分:1)
确保你重写
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; // Override to allow rotation. Default returns YES only for UIInterfaceOrientationPortrait
要为每个要支持的UIInterfaceOrentation返回YES,否则将不会调用willRotateToInterfaceOrientation和didRotateToInterfaceOrientation。
答案 2 :(得分:0)
尝试在您的applicationDidFinishLauching:
中尽早调用它[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
答案 3 :(得分:0)
由于detailViewController
有时不知道其方向,我通过在appDelegate
中设置一个共享变量来解决此问题,该变量会在整个应用中存储设备方向。您可以在splitViewController
中按其方向对其进行初始化,以便detailViewController
加载时可以从那里读取它。