将可能的输入类型添加到CGRect Swift

时间:2018-12-14 10:03:07

标签: ios swift class

我希望能够将百分比值传递给CGRect

我创建了一个Percentage类来获取输入,然后创建了四个值(x,y,宽度,高度)

现在,我需要为CGRect创建一个扩展,以便能够使用其中的Percentage值。扩展程序返回错误。

extension CGRect {
    init(x: Percentage, y: Percentage, width: Percentage, height: Percentage) {
        self.init(x: Percentage.x, y: Percentage.y, width: Percentage.width, height: Percentage.height)
  

错误:实例成员“ x”不能用于类型“百分比”

    }
}


class Percentage {
    let x: CGFloat
    let y: CGFloat
    let width: CGFloat
    let height: CGFloat

    init(_ value: CGFloat) {
        self.x = UIScreen.main.bounds.width * value
        self.y = UIScreen.main.bounds.height * value
        self.width = UIScreen.main.bounds.width * value
        self.height = UIScreen.main.bounds.height * value
    }
}

感谢您的帮助;)

编辑:

我想能够像这样使用它:

CGRect(x: Percentage(0.5), y: 50, width: 100, height: 100)

2 个答案:

答案 0 :(得分:3)

  

实例成员'x'不能用于类型'百分比'

您正在使用类的类型,因此即使您使用了参数percentage,也无法使用。

但是更好的情况是,您只是将某些Percentage用作init的参数,然后使用其属性(将它与小的p一起使用,因为您需要使用init参数,而不是类类型)

init(percentage: Percentage) {
    self.init(x: percentage.x, y: percentage.y, width: percentage.width, height: percentage.height)
}

编辑后,我不得不说您不必使用自定义init,您只需传递Percentage的属性

CGRect(x: yourPercentage.x, y: 50, ...)

答案 1 :(得分:-1)

认为不需要自定义扩展名/类-只需使用:

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let viewRect = view.frame

let scaleFactor:CGFloat = 0.5
let scaledFrame = viewRect.applying(CGAffineTransform(scaleX: scaleFactor, y: scaleFactor))

print("Scaled size: \(scaledFrame)")
// Scaled size: (0.0, 0.0, 50.0, 50.0)

但是,您也可以将此“功能”移至扩展名。