ios xcode에서 다양한 화면 크기 다루기



objective-c iphone (3)

iPhone 5 또는 6에서 4로 이동하면 화면 종횡비가 16 : 9 (5 및 6)에서 4 : 3 (iPhone 4)로 변경됩니다. 이미지 왜곡이없는 옵션은 SKSceneScaleModeAspectFill (현재) 또는 SKSceneScaleModeAspectFit을 사용해야합니다. Apple doc에서 :

SKSceneScaleModeAspectFill ".... 이렇게하면 뷰의 전체 영역이 채워지지만 장면의 일부가 잘릴 수 있습니다."

SKSceneScaleModeAspectFit "..... 이렇게하면 전체 장면을 볼 수 있지만보기에서 레터 박스가 필요할 수 있습니다."

위의 두 가지 옵션 중 어느 것도 내가 원하는 것을 제공하지 않았기 때문에 비슷한 문제가 발생하여 4 : 3 장치 (iPhone 4 / iPad)에 대해 별도의 이미지를 재생성했습니다.

나는 iPhone 6 용으로 처음 개발 된 iPhone 게임을 가지고 있으며, iPhone 5 sim에서 재생할 때는 잘 동작하지만 iPhone 4 sim에서 재생하면 측면이 늘어납니다. 그리고 아이폰 6과 5처럼 스크린 대신 화면의 왼쪽과 오른쪽에서 스폰되는 노드가 표시됩니다. (몇 주 동안이 코드를 찾고 있었습니까? 다른 아이폰을 다루기 위해)

나는 y 축에서 무작위로 산란하는 화살표를 왼쪽에서부터 그리고 오른쪽에서 오는 것입니다. 그것들은 화면에서 벗어나 화면을 천천히 움직이는 것보다 화면에서 천천히 움직이지만, iPhone 4에서는 화살표가 화면에 나타납니다. 이것은 화살표 중 하나의 코드입니다.

-(void) leftArrow
{
    int randomY = arc4random() % (675 - 175);
    int yPoint = randomY + 175;
    leftArrow = [SKSpriteNode spriteNodeWithImageNamed:@"arrow"];

    leftArrow.size = CGSizeMake(leftArrow.size.width/1.2, self.frame.size.height/22);
    leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - 230, yPoint);
    leftArrow.zPosition = 50;
    leftArrow.alpha = 1;

    SKAction* action1 = [SKAction moveToX:leftArrow.position.x + 30 duration:0.5];
    SKAction* wait = [SKAction waitForDuration:0.75];
    SKAction* action2 = [SKAction moveToX:leftArrow.position.x + 470 duration:1.5];
    SKAction* sequence = [SKAction sequence:@[action1,wait,action2,destroy]];

    [self addChild:leftArrow];
    if (deadDown == 1 || deadUp == 1 || didIntersect == true)
    {
        [leftArrow runAction:destroy];
    }
    else
    {
        [leftArrow runAction:sequence completion:^{
            if (ii != 1)
            {
                if (didIntersect != true)
                {
                    score++;
                    if (score == 100)
                    {
                        backgroundScore.fontSize = 300;
                        backgroundScore.position = CGPointMake(backgroundScore.position.x, backgroundScore.position.y + 30);
                }
                strFromInt = [NSString stringWithFormat:@"%d",score];
                backgroundScore.text = strFromInt;
                }
            }
        }];
    }
}

나는 또한 내 didmovetoview 함수에서 이것을 사용하고있다.

self.scaleMode = SKSceneScaleModeAspectFill;

Answer #1

실제 크기 대신 비율을 사용해보십시오. 모든 iOS 기기는 너비와 높이가 다릅니다.

이것을 바꿔 라.

leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - 230, yPoint);

이런 식으로

leftArrow.position = CGPointMake(CGRectGetMidX(self.frame) - self.frame.size.width / 2, yPoint);

나는 단지 그것이해야 할 일을 짐작할 수 있지만 이것을 바꾸어 보라.

int randomY = arc4random() % (675 - 175);
int yPoint = randomY + 175;

이에:

int randomY = arc4random() % (self.frame.size.height - self.frame.size.height / 4);
int yPoint = randomY + self.frame.size.height / 4;

또한 나는 당신이 이것을 바꿀 것을 권할 것이다 :

그것들을 "30"과 "470"

SKAction* action1 = [SKAction moveToX:leftArrow.position.x + 30 duration:0.5];

SKAction* action2 = [SKAction moveToX:leftArrow.position.x + 470 duration:1.5];

Answer #2

주요 문제는 이미지 자산 및 화면 개체 좌표와 관련하여 다양한 화면 크기를 처리하는 것입니다.

내 솔루션은 아이폰 6 플러스를 코딩하는 것처럼 코드를 작성하는 것이다. 모든 이미지를 @ 3x 크기로 만들고 iPhone 6 화면 크기에 맞게 화면 레이아웃을 조정하십시오.

약간의 코드만으로 iPhone 6 플러스, 6, 5 및 4 스크린 크기의 균일 한 레이아웃을 얻을 수있었습니다. 각 스크린 샷을 포함 시켰습니다. 문자 이미지는 300x300입니다. 2 버튼 이미지는 100x100입니다.

static const float kIphone6PlusScaleFactorX = 1.0;
static const float kIphone6PlusScaleFactorY = 1.0;
static const float kIphone6ScaleFactorX = 0.9;
static const float kIphone6ScaleFactorY = 0.9;
static const float kIphone5ScaleFactorX = 0.772;
static const float kIphone5ScaleFactorY = 0.772;
static const float kIphone4ScaleFactorX = 0.772;
static const float kIphone4ScaleFactorY = 0.652;

#import "GameScene.h"

@implementation GameScene {
    float scaleFactorX;
    float scaleFactorY;

    SKSpriteNode *node0;
    SKSpriteNode *node1;
    SKSpriteNode *node2;
    SKLabelNode *label0;
}

-(void)didMoveToView:(SKView *)view {
self.backgroundColor = [SKColor blackColor];

    if(view.frame.size.height == 736) {
        NSLog(@"iPhone 6 plus");
        scaleFactorX = kIphone6PlusScaleFactorX;
        scaleFactorY = kIphone6PlusScaleFactorY;
    }
    if(view.frame.size.height == 667) {
        NSLog(@"iPhone 6");
        scaleFactorX = kIphone6ScaleFactorX;
        scaleFactorY = kIphone6ScaleFactorY;
    }
    if(view.frame.size.height == 568) {
        NSLog(@"iPhone 5");
        scaleFactorX = kIphone5ScaleFactorX;
        scaleFactorY = kIphone5ScaleFactorY;
    }
    if(view.frame.size.height == 480) {
        NSLog(@"iPhone 4");
        scaleFactorX = kIphone4ScaleFactorX;
        scaleFactorY = kIphone4ScaleFactorY;
    }

    node0 = [SKSpriteNode spriteNodeWithImageNamed:@"Pic"];
    node0.position = CGPointMake(self.size.width/2, self.size.height/2);
    [node0 setScale:scaleFactorX];
    [self addChild:node0];

    node1 = [SKSpriteNode spriteNodeWithImageNamed:@"button0"];
    node1.position = CGPointMake(100*scaleFactorX, 100*scaleFactorY);
    [node1 setScale:scaleFactorX];
    [self addChild:node1];

    node2 = [SKSpriteNode spriteNodeWithImageNamed:@"button1"];
    node2.position = CGPointMake(314*scaleFactorX, 100*scaleFactorY);
    [node2 setScale:scaleFactorX];
    [self addChild:node2];

    label0 = [SKLabelNode labelNodeWithFontNamed:@"HelveticaNeue-Bold"];
    label0.text = @"Big Game Menu";
    label0.fontSize = 48*scaleFactorX;
    label0.fontColor = [SKColor whiteColor];
    label0.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter;
    label0.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
    label0.position = CGPointMake(207*scaleFactorX,690*scaleFactorY);
    [self addChild:label0];
}

아이폰 4

아이폰 5

아이폰 6

아이폰 6 플러스

텍스트 레이블도 글꼴 크기뿐만 아니라 위치에 따라 정확하게 축소되는 것을 확인할 수 있습니다.

위의 논리를 사용하여 화면 크기와 관련하여 노드를 생성 할 수 있습니다.

참고로 간단한 버전으로 작업하기가 더 쉽기 때문에 GameViewController에서 표준 코드를 사용했습니다. 이것은 내 SKView를 제시하는 데 사용 된 코드입니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    SKView * skView = (SKView *)self.view;
    SKScene *scene = [GameScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    [skView presentScene:scene];
}




sprite-kit