How can I increase the size of a CGRect by a certain percent value?

后端 未结 7 2019
春和景丽
春和景丽 2021-02-12 14:22

How can I increase the size of a CGRect by a certain percent value? Should I use some form of CGRectInset to do it?

Example:

Assume I have a CGRect:

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-12 14:57

    Swift 4 extension inspired by several of the answers here with simplified calculations:

    extension CGRect {
        func scaleLinear(amount: Double) -> CGRect {
            guard amount != 1.0, amount > 0.0 else { return self }
            let ratio = ((1.0 - amount) / 2.0).cgFloat
            return insetBy(dx: width * ratio, dy: height * ratio)
        }
    
        func scaleArea(amount: Double) -> CGRect {
            return scaleLinear(percent: sqrt(amount))
        }
    
        func scaleLinear(percent: Double) -> CGRect {
            return scaleLinear(amount: percent / 100)
        }
    
        func scaleArea(percent: Double) -> CGRect {
            return scaleArea(amount: percent / 100)
        }
    }
    

    Usage is simply:

    rect.scaleLinear(percent: 120.0)  OR (amount: 1.2)
    rect.scaleArea(percent: 120.0)  OR (amount: 1.2)
    

    If you are interested in trying my testing methods:

    /// Testing
    extension CGRect {
        var area: CGFloat { return width * height }
        var center: CGPoint { return CGPoint(x: origin.x + width/2, y: origin.y + height/2)
        }
    
        func compare(_ r: CGRect) {
            let centered = center.x == r.center.x && center.y == r.center.y
            print("linear = \(r.width / width), area = \(r.area / area) centered \(centered)")
        }
    
        static func ScaleTest() {
            let rect = CGRect(x: 17, y: 24, width: 200, height: 100)
            let percent = 122.6
            rect.compare(rect.scaleLinear(percent: percent))
            rect.compare(rect.scaleArea(percent: percent))
        }
    }
    

提交回复
热议问题