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