Swift - UIView 框架不等于 UIView.layer.frame

Posted

技术标签:

【中文标题】Swift - UIView 框架不等于 UIView.layer.frame【英文标题】:Swift - UIView frame is not equal to UIView.layer.frame 【发布时间】:2014-11-17 17:01:07 【问题描述】:

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

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)

但未显示 eauql。我尝试使用 theView.layer.frame 但没有成功...

【问题讨论】:

【参考方案1】:

问题是因为每个帧的上下文不同。您的视图框架 (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 might not always be (0, 0),所以我认为您的第二个解决方案更好。 除了@AaronBrager、frame might be invalidated by transform,最好使用bounds.size

以上是关于Swift - UIView 框架不等于 UIView.layer.frame的主要内容,如果未能解决你的问题,请参考以下文章

swift - 当设备旋转到横向(iPhone/iPad)时,如何让 UIView 变成全屏?

为啥在 Swift 中使用惰性 var 初始化时添加框架不显示 UIView

swift 3 layoutIfneeded 无法正常工作

除非等于 UIView 框架,否则框架不会正确更改

在 Swift 中让 UIView 粘在 ViewController 框架的底部

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?