【问题标题】:View Layer insertSublayer is not updating the layer视图层 insertSublayer 未更新层
【发布时间】:2023-03-23 10:23:01
【问题描述】:

我正在尝试将渐变层添加到我的视图中,第一次运行代码时它会完美地插入层,但每 10 秒我再次运行相同的函数来更改层,但它不会更新层。

if ([[self.view.layer sublayers] count]>1) {
    CAGradientLayer *gradientLayer=[ColorUtilities randomGradient];
    gradientLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view.layer insertSublayer:gradientLayer atIndex:0];
    //[self.view.layer replaceSublayer:[[self.view.layer sublayers] objectAtIndex:0] with:gradientLayer];
}

这里[ColorUtilities randomGradient] 每次都会给我一个随机层。

为什么层atindex:0 没有更新?

【问题讨论】:

  • 代码调用的是哪个线程?如果它不是主线程,你会期望视图没有更新。
  • 我没有复制粘贴整个代码,但它在dispatch_async(dispatch_get_main_queue(), ^{内部被调用

标签: ios objective-c uiview colors calayer


【解决方案1】:

@dominikweifieg 的评论有些有效。只需保留一个标志,如果您是第一次添加图层,则在此之后替换子图层

这样的东西应该可以工作

-(void)updateGradientLayer
{
//isFirstTimeInserting is a global BOOL
    if (isFirstTimeInserting==YES) {
        CAGradientLayer *gradientLayer=[ColorUtilities randomGradient];
        gradientLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [self.view.layer insertSublayer:gradientLayer atIndex:0];
        isFirstTimeInserting=NO;
    }
    else
    {
        if ([[self.view.layer sublayers] count]>=1) {
        CAGradientLayer *gradientLayer=[ColorUtilities randomGradient];
        gradientLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [self.view.layer insertSublayer:gradientLayer above:[[self.view.layer sublayers] objectAtIndex:0]];
        }
    }
}

【讨论】:

    【解决方案2】:

    在索引 0 处插入新的渐变层会将其置于您第一次插入的渐变层下方,因此它不可见。尝试使用 insertLayer:above: 将其插入到最后一个渐变层之上:

    【讨论】:

    • 这对我来说没有意义,我使用渐变层作为背景,所以 insertingLayer:above: 弄乱了我的 UI,因为 UI 上还有其他视图,加上为什么 replaceSublayer 不起作用?
    • 嗯,有一点是肯定的,如果您在索引 0 处插入该层将永远不可见,因为它隐藏在您的第一个渐变层后面。 ReplaceSublayer 应该正常工作,只是不是第一次,因为你不能用 nil 作为第一个参数来调用它。因此,请尝试在第一次调用时使用 insertsublayer,并在后续调用时使用 replacesublayer。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多