CALayer is not positioned correctly within the View(CALayer在视图中的位置不正确)
问题描述
上下文
我正在使用this simple library为我的应用程序(TL;DR,水平分页视图控制器)进行介绍/演练。我当前有3个页面设置。
在第三个演练页面中,我有一个自定义的CALayer
,它在无限循环中设置了一个圆的动画。我想将该层添加到UIView
,以便按照我想要的方式在IB中进行布局(通过自动布局)。
在viewDidLoad
中(对于第3页),我创建了圆形层,并将其框架设置为与我定位的视图相同的边框,假设圆形将与视图位于同一位置:
for v:UIView in [view1!, view2!] {
var pulse = PulseLayer()
pulse.frame = v.frame
pulse.cornerRadius = v.frame.width / 2.0
pulse.masksToBounds = false
view.layer.insertSublayer(pulse, above: v.layer)
}
问题
当我在iPhone 6模拟器中运行该应用程序时,CALayer显示在其UIView之外(见下文)。
我立即注意到的一件事是,层的位置不同--一个位于其视图上方,另一个位于左侧。我假设这与对视图的约束有关,但我想不出如何修复它。
同样令我困惑的是,当在iPhone5模拟器上运行时,层显示与我预期的完全相同(见下文)。我觉得我误解了这里工作中的一些概念。我如何才能找到行动一致的定位?(如iPhone5 gif)
或者,有没有更好的方法来做我正在尝试做的事情?
推荐答案
viewDidLoad
太快。请记住,viewDidLoad
为时过早;视图还没有出现在界面中,任何东西都没有它的最终大小/位置。如果要将层添加到view
而不是作为小视图的子层,则必须在很长一段时间后运行层创建代码,以便正确定位。viewDidAppear:
或viewDidLayoutSubviews
将是安全的--但当然,您必须使用布尔标志,这样做的次数才不会太多。
就我个人而言,我不明白您为什么不在小视图中添加层。因此,您只需设置pulse.frame = v.bounds
并作为子层添加到v
,而不是添加到您的view
。它解决了定位问题,并建立了正确的关系。在viewDidLoad
中操作也是可行的,因为当视图移动时,层也会随之移动。
这篇关于CALayer在视图中的位置不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:CALayer在视图中的位置不正确
基础教程推荐
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01