CALayer在视图中的位置不正确

CALayer is not positioned correctly within the View(CALayer在视图中的位置不正确)
本文介绍了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在视图中的位置不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)