Created
April 14, 2016 23:54
-
-
Save jkosoy/aa94d4e86972c2136375c7f500ffa473 to your computer and use it in GitHub Desktop.
Calculating for different device Aspect Ratios, used in Melody Jams
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// CoreGraphics+AspectRatio.swift | |
// EmptySpriteKitGame | |
// | |
// Created by Jamie Kosoy on 11/6/15. | |
// Copyright © 2015 Arbitrary. All rights reserved. | |
// | |
import UIKit | |
import Foundation | |
extension CGRect { | |
init(sx: CGFloat, sy: CGFloat, swidth: CGFloat, sheight: CGFloat) { | |
self.init(origin: CGPoint(sx: sx, sy: sy), size: CGSize(swidth: swidth, sheight: sheight)) | |
} | |
} | |
extension CGPoint { | |
init(sx: CGFloat, sy: CGFloat) { | |
self.init(x: sx.xForIdiom(), y: sy.yForIdiom()) | |
} | |
func pointForIdiom() -> CGPoint { | |
return CGPoint(sx: self.x, sy: y) | |
} | |
} | |
extension CGSize { | |
init(swidth: CGFloat, sheight: CGFloat) { | |
self.init(width: swidth.widthForIdiom(), height: sheight.heightForIdiom()) | |
} | |
func sizeForIdiom() -> CGSize { | |
return CGSize(swidth: self.width, sheight: self.height) | |
} | |
// http://stackoverflow.com/questions/6278876/how-to-know-the-image-size-after-applying-aspect-fit-for-the-image-in-an-uiimage | |
static func aspectFit(aspectRatio: CGSize, inout boundingSize: CGSize) -> CGSize { | |
let mW = boundingSize.width / aspectRatio.width; | |
let mH = boundingSize.height / aspectRatio.height; | |
if( mH < mW ) { | |
boundingSize.width = boundingSize.height / aspectRatio.height * aspectRatio.width; | |
} | |
else if( mW < mH ) { | |
boundingSize.height = boundingSize.width / aspectRatio.width * aspectRatio.height; | |
} | |
return boundingSize; | |
} | |
static func aspectFill(aspectRatio: CGSize, inout minimumSize: CGSize) -> CGSize { | |
let mW = minimumSize.width / aspectRatio.width; | |
let mH = minimumSize.height / aspectRatio.height; | |
if( mH > mW ) { | |
minimumSize.width = minimumSize.height / aspectRatio.height * aspectRatio.width; | |
} | |
else if( mW > mH ) { | |
minimumSize.height = minimumSize.width / aspectRatio.width * aspectRatio.height; | |
} | |
return minimumSize; | |
} | |
} | |
extension CGFloat { | |
private static let WidthRatio: CGFloat = 1024 / 568 | |
private static let HeightRatio: CGFloat = 768 / 320 | |
private static let PadIdiomXOffset: CGFloat = ((568 * HeightRatio) - 1024) / 2 | |
static let iPadAspectRatio = HeightRatio | |
func widthForIdiom() -> CGFloat { | |
switch UIDevice.currentDevice().userInterfaceIdiom { | |
case .Pad: | |
return self * CGFloat.HeightRatio | |
default: | |
return self | |
} | |
} | |
func heightForIdiom() -> CGFloat { | |
switch UIDevice.currentDevice().userInterfaceIdiom { | |
case .Pad: | |
return self * CGFloat.HeightRatio | |
default: | |
return self | |
} | |
} | |
func xForIdiom() -> CGFloat { | |
switch UIDevice.currentDevice().userInterfaceIdiom { | |
case .Pad: | |
return (self * CGFloat.HeightRatio) - CGFloat.PadIdiomXOffset | |
default: | |
return self | |
} | |
} | |
func yForIdiom() -> CGFloat { | |
switch UIDevice.currentDevice().userInterfaceIdiom { | |
case .Pad: | |
return self * CGFloat.HeightRatio | |
default: | |
return self | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment