Swift - UIView的frame属性与UIView.layer.frame属性不相等

6

我想绘制一个UIView层,但是当我这样做时,该层的框架与UIView的框架不相等(在预览中)。

enter image description here
class ViewController: UIViewController {

    var graphHeight:CGFloat = 100
    var graphSize:CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()
        graphSize = self.view.frame.height/CGFloat(M_PI)
        let graphRect:CGRect = CGRectMake(0, graphHeight, self.view.frame.width, graphSize)
        let background = blueGardient()
        var theView:UIView = UIView(frame: graphRect)
        background.frame = theView.frame
        theView.backgroundColor = UIColor.yellowColor()
        theView.layer.cornerRadius = 8
        theView.layer.borderWidth = 1
        theView.layer.borderColor = UIColor.redColor().CGColor
        theView.layer.insertSublayer(background, atIndex: 0)
        self.view.addSubview(theView)

    }

    func blueGardient()->CAGradientLayer{
        let topColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.7)
        let bottomColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.9)
        let gradientColors: [CGColor] = [topColor.CGColor, bottomColor.CGColor]
        let gradientLocations: [Float] = [0.0, 1.0]
        let gradientLayer: CAGradientLayer = CAGradientLayer()
        gradientLayer.colors = gradientColors
        gradientLayer.locations = gradientLocations
        return gradientLayer
    }
}

框架是相等的。
(0.0,100.0,320.0,180.800015352393)
(0.0,100.0,320.0,180.800015352393)

但是没有显示相等。我尝试使用View.layer.frame,但没有成功...

1个回答

10
问题是因为每个框架的上下文不同。您的视图框架(theView.frame)在其父视图的上下文中,因此(0,100)原点意味着它从屏幕左上方向下偏移了100个点。图层的框架(background.frame)在所属视图(theView)的上下文中,因此相同的(0,100)原点意味着蓝色图层从视图的左上角偏移了100个点。
不要使用视图的frame,而是创建一个新的矩形,使用视图的bounds大小和原点(0,0)。
background.frame = CGRect(origin: CGPointZero, size: theView.bounds.size)

1
从技术上讲,bounds.origin可能不总是(0,0),所以我认为你的第二个解决方案更好。 - Aaron Brager
2
除了 @AaronBrager 提到的,transform 可能会使 frame 失效,最好使用 bounds.size - rintaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接