Skip to content

Instantly share code, notes, and snippets.

@artemkrachulov
Created July 25, 2016 07:31
Show Gist options
  • Save artemkrachulov/f67653b98dfc866c1528290a9e808978 to your computer and use it in GitHub Desktop.
Save artemkrachulov/f67653b98dfc866c1528290a9e808978 to your computer and use it in GitHub Desktop.
//
// CGRect+Geometry.swift
//
// Created by Artem Krachulov.
// Copyright (c) 2016 Artem Krachulov. All rights reserved.
// http://www.artemkrachulov.com
//
import UIKit
extension CGRect {
/// The center of rectangle (ignoring origin property) and is measured in points. Setting this property changes the values of the rectangle accordingly.
///
/// Usage:
///
/// let rect1 = CGRectMake(0, 0, 500, 400)
/// let rect1Center = rect1.center // {x 250 y 200}
///
/// var rect2 = CGRectMake(0, 0, 200, 350)
///
/// rect2.center = rect1Center // {x 150 y 25 w 200 h 350}
///
public var center: CGPoint {
get {
return CGPointMake(width / 2, height / 2)
}
set(newValue) {
origin = CGPointMake(newValue.x - width / 2, newValue.y - height / 2)
}
}
/// Returns scaled and centered rectangle to fit size target rectangle.
///
/// Usage:
///
/// let rect1 = CGRectMake(0, 0, 500, 400)
/// var rect2 = CGRectMake(0, 0, 200, 350)
///
/// let fitScaleRect = rect1.fitScaleRelativeTo(rect2) // {x 0 y 95 w 200 h 160}
///
public func fitScaleRelativeTo(rect: CGRect) -> CGRect {
var newRect = self
newRect.size = newRect.size.increaseBy(multiplier: CGSizeGetFitScaleMultiplier(size, relativeToSize: rect.size))
newRect.center = rect.center
return newRect
}
/// Returns scaled and centered rectangle to fill size target rectangle.
///
/// Usage:
///
/// let rect1 = CGRectMake(0, 0, 500, 400)
/// var rect2 = CGRectMake(0, 0, 200, 350)
///
/// let fillScaleRect = rect1.fillScaleRelativeTo(rect2) // {x -118.75 y 0 w 437.5 h 350}
///
public func fillScaleRelativeTo(rect: CGRect) -> CGRect {
var newRect = self
newRect.size = newRect.size.increaseBy(multiplier: CGSizeGetFillScaleMultiplier(size, relativeToSize: rect.size))
newRect.center = rect.center
return newRect
}
/// Return rectangle where frame increased by multiplier.
///
/// Original method
///
/// func increaseBy(multiplier multiplier: CGFloat) -> CGSize
public func increase(byMultiplier multiplier: CGFloat) -> CGRect {
return CGRectMake(origin.x*multiplier, origin.y*multiplier, size.width*multiplier, size.height*multiplier)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment