Objective-C,[UIScreen mainScreen] .bounds.size.width实际给出了什么以及initWithSize实际需要什么?

时间:2015-08-20 08:32:39

标签: ios objective-c

我正在编写一个GUI,主菜单,第二个屏幕和主菜单的后退按钮。从最初的主菜单中我使用以下代码行:

midScreenX = [UIScreen mainScreen].bounds.size.width/2;
midScreenY = [UIScreen mainScreen].bounds.size.height/2;

    WarScene *battle = [[WarScene alloc] initWithSize: CGSizeMake(midScreenX*2, midScreenY*2)];
    SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
    SKView * skView = (SKView *)self.view;
    UIView *viewToRemove = [self.view viewWithTag:101];
    [viewToRemove removeFromSuperview];
    [skView presentScene:battle transition:reveal];

这有效......我想。我打开一个新场景,我的第二个场景是正确的大小,至少填满了屏幕。该场景中有一个节点对于屏幕而言太大了,我正在努力改变它,但我不认为这会影响到UIScreen的界限。

当我使用以下代码返回主菜单时出现问题:

midScreenX = [UIScreen mainScreen].bounds.size.width/2;
midScreenY = [UIScreen mainScreen].bounds.size.height/2;

GameScene *map = [[GameScene alloc] initWithSize: CGSizeMake(midScreenX*2 ,midScreenY*2)];
SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
SKView * skView = (SKView *)self.view;
UIView *viewToRemove = [self.view viewWithTag:3];
[viewToRemove removeFromSuperview];
[skView presentScene:map transition:reveal];

据我所知,传递的值应与最初为[UIScreen mainScreen] .bounds.size发送的值完全相同,但初始化的场景太大了。

我可以做些什么可能影响[UIScreen mainScreen] .bounds.size?或者我误解了init和.bounds实际上做了什么?

就我自己尝试解决这个问题所做的事情而言,我已经看过场景通常如何初始化的例子。我看到通常使用值来代替.bounds,例如:

initWithSize: CGSizeMake(1024,768) 

然而,这并不意味着在不同的设备上,场景不会被正确/完全显示?

1 个答案:

答案 0 :(得分:1)

如果您使用的是iOS 6或iOS 7, [UIScreen mainScreen] .bounds.size.width和[UIScreen mainScreen] .bounds.size.height在所有方向都相同.. 但在iOS 8中,它在横向上给出一个值,并在纵向模式下给出另一个值

NSLog(@"width %f",[[UIScreen mainScreen] bounds].size.width);  //portrait ios7 or 6 = 320  , landscape ios7 or 6 = 320
NSLog(@"height %f",[[UIScreen mainScreen] bounds].size.height); //portrait ios7 or 6 = 568 ,  landscape ios7 or 6 = 568

NSLog(@"width %f",[[UIScreen mainScreen] bounds].size.width);  //portrait ios8 = 320  , landscape ios8 = 568
NSLog(@"height %f",[[UIScreen mainScreen] bounds].size.height); //portrait ios8 = 568 ,  landscape ios8 = 320

所以我们可以查看这样的条件,

CGFloat midScreenX,midScreenY;
if (UIDeviceOrientationIsLandscape((UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]))
{
    //landscape mode
    midScreenX = ([[UIScreen mainScreen]bounds].size.width>[[UIScreen mainScreen]bounds].size.height?[[UIScreen mainScreen]bounds].size.width:[[UIScreen mainScreen]bounds].size.height)/2;
    midScreenY = ([[UIScreen mainScreen]bounds].size.width<[[UIScreen mainScreen]bounds].size.height?[[UIScreen mainScreen]bounds].size.width:[[UIScreen mainScreen]bounds].size.height)/2;
}
else
{
    //portrait mode
    midScreenX = [[UIScreen mainScreen]bounds].size.width/2;
    midScreenY = [[UIScreen mainScreen]bounds].size.height/2;
}

我希望你warScene和gameScene是SKScene的子类。 initWithSize方法返回一个新初始化的场景对象。和参数&#39; size&#39;是以点为单位的场景大小。

有关更多信息,请参阅https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKScene_Ref/index.html#//apple_ref/occ/instm/SKScene/initWithSize