- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用此功能使用大量渐变绘图:
func drawGradient(colors: [CGColor], locations: [NSNumber]) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame.size = self.frame.size
gradientLayer.frame.origin = CGPoint(x: 0.0,y: 0.0)
gradientLayer.colors = colors
gradientLayer.locations = locations
print(self.frame.size)
self.layer.insertSublayer(gradientLayer, at: 0)
}
问题是,如果我不在 UIViewController
的 viewDidLoad()
中调用 self.view.layoutIfNeeded()
,我的渐变不会在 iPhone X+ 上覆盖整个屏幕。但是,如果我调用 self.view.layoutIfNeeded()
,它会使我的应用程序在 iOS 9.x 上崩溃并在 iPhone 5/5s 上表现得很奇怪。我真的不知道有什么解决方法,需要帮助才能理解它是如何工作的。
最佳答案
您正在 viewDidLoad
中调用 drawGradient
。那太早了。您需要等到 Auto Layout 确定框架的大小。将 viewDidLoad
中的调用移动到 viewDidLayoutSubviews
的重写。不过要小心,因为 viewDidLayoutSubviews
被调用了不止一次,所以请确保只调用一次 drawGradient
。您可以向 viewController 添加一个名为 var appliedGradient = false
的属性,然后在应用渐变之前检查它并将其翻转为 true
。
对于 UITableViewCell
和 UICollectionViewCell
的自定义子类,覆盖 layoutSubviews
并在 super 之后调用
。同样,确保只调用一次。drawGradient
.layoutSubviews()
注意:如果您的框架
可以调整大小(由于手机的旋转)或不同的单元格大小,您应该跟踪之前的渐变层并将其替换为在 viewDidLayoutSubviews
中为您的 viewController 和在 layoutSubviews
中为您的单元格添加一个新的。
在这里,我修改了您的 drawGradient
以创建一个名为 applyGradient
的全局函数,用于向 View 添加渐变。如果有的话,它会替换之前的渐变层:
func applyGradient(colors: [CGColor], locations: [NSNumber], to view: UIView, replacing prior: CALayer?) -> CALayer {
let gradientLayer = CAGradientLayer()
gradientLayer.frame.size = view.frame.size
gradientLayer.frame.origin = CGPoint(x: 0.0,y: 0.0)
gradientLayer.colors = colors
gradientLayer.locations = locations
print(view.frame.size)
if let prior = prior {
view.layer.replaceSublayer(prior, with: gradientLayer)
} else {
view.layer.insertSublayer(gradientLayer, at: 0)
}
return gradientLayer
}
它是这样使用的:
class ViewController: UIViewController {
// property to keep track of the gradient layer
var gradient: CALayer?
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
gradient = applyGradient(colors: [UIColor.red.cgColor, UIColor.yellow.cgColor],
locations: [0.0, 1.0], to: self.view, replacing: gradient)
}
}
关于ios - layoutIfNeeded 函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41332022/
不太明白为什么layoutIfNeeded仍然没有返回布局的正确宽度...但是如果我通过调度获得宽度,它将返回正确的宽度。看来layoutIfNeeded 不会立即布局,而是异步的。如果我错了请纠正我
出现崩溃: navigationController.view.layoutIfNeeded() log : fatal error: unexpectedly found nil while unw
我有一个表格 View ,我使用此方法计算单元格高度 override func tableView(_ tableView: UITableView, heightForRowAt indexPat
所以,我有这样的代码 UIView.animate(withDuration: 2) { self.navigationController?.navigationBar.isHidden =
我有一个 UITextView,正在显示文本当文本不是很大时(我说的是 100-200 个单词),应用程序运行得很好 如果文本非常大(大约 10000 个单词),它就会不断崩溃 代码 func scr
我有一个按钮,可以根据某些情况改变大小。我不需要完成动画,因为用户永远看不到发生的变化。有时,当从较小尺寸切换回较大尺寸时,按钮会卡在较小尺寸上。我认为 layoutIfNeeded() 可以解决这个
我正在为 UITextField 的大小调整设置动画。我正在使用带有约束的自动布局。我的 Storyboard 中有 H:|-[textField] -(8)-[label]-(8)-[image]-
我正在使用此功能使用大量渐变绘图: func drawGradient(colors: [CGColor], locations: [NSNumber]) { let gradientLay
何时以及如何使用 layoutIfNeeded?我知道当我们更改 View 的布局时,我们可以调用 setNeedsLayout 来更新布局,但不确定何时应该使用 layoutIfNeeded。 注意
我正在 xib 文件中创建以下 View 。 有两个约束,我一次想要其中一个,所以我激活一个并停用另一个约束。 其中一个约束是 View (顶层 View )view.bottom == inputV
我正在尝试使用自动版式在屏幕上和屏幕外为我的 ADBannerView 制作动画。预自动布局(设置框架和动画)一切正常。现在我有以下代码,它在 viewDidLoad 上运行以确保广告横幅是否离开屏幕
我已经以编程方式构建了 View ,然后为它们设置了动画。有一个 View 动画链,最后一个是要设置动画的按钮。 当我通过调用 layoutIfNeeded() 更改约束(这些约束独立于其他约束并且没
我遇到了一个让我很困惑的问题。我写了一个简单的两张图片的动画,效果很好。但是突然间它停止了动画,我不明白为什么。我没有做任何我能想到的会影响动画的改变。我已经检查过 NSLayoutConstrain
UIView 我有两种状态: 我在它们之间使用 @IBaction 为 button 制作动画: @IBAction func tapped(sender: UIButton) { flag
一些 S.O.问题展示了一种自动布局技术,用于确定 View 满足其约束所需的最小尺寸:[header systemLayoutSizeFittingSize: UILayoutFittingComp
我这里有一个用于自定义 tableview 单元格的类,但在 awakeFromNib 中,self.frame 始终为 0,0,0,0。我尝试调用 [self layoutIfNeeded] 但这没
layoutIfNeeded 在 iPad 上无法正常工作,但在 iPhone 上可以正常工作。我想要一个圆形按钮。在 iPhone 上圆圈生成正确,但在 iPad 上它看起来像菱形。 _btnthu
我有一个适用于 iPad 的数学程序,它使用 Big Number 库进行计算,然后根据这些计算更新 UIView (myView) 中最多包含 20,000 个 UILabel 的数组。 计算可能需
我注意到的奇怪的事情: let navController = UINavigationController(rootViewController: myRootViewController) nav
我的主视图有一个 subview ,我使用以下扩展添加了一个掩码: extension UIView{ func addTopRoundCorners(){ let bezierPath =
我是一名优秀的程序员,十分优秀!