【问题标题】:How to avoid infinite layoutSubviews如何避免无限的layoutSubviews
【发布时间】:2016-11-10 05:59:04
【问题描述】:

我有一个 UITableViewCell 子类,它覆盖 layoutSubviews 以将淡入淡出效果应用于 web 视图。在大多数情况下,它工作正常,但有时它最终会处于一种状态,即 layoutSubvies 不断被调用,并且 webview 的内容高度值交替变化。

还有其他地方我可以应用这个渐变来避免这个问题吗?

CAGradientLayer* gradientLayer = nil;
int webViewHeight = 0;

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews %f", self.webView.scrollView.contentSize.height);

    [super layoutSubviews];

    if (self.webView.scrollView.contentSize.height == webViewHeight) {
        // nothing has changed
        return;
    }

    if (gradientLayer != nil) {
        [gradientLayer removeFromSuperlayer];
        gradientLayer = nil;
    }

    // if cell height is less than web view height we must fade
    if (self.frame.size.height < self.webView.scrollView.contentSize.height) {
        webViewHeight = self.webView.scrollView.contentSize.height;
        gradientLayer = [CAGradientLayer layer];

        NSObject* fadeColor = (NSObject*)[UIColor colorWithWhite:1.0 alpha:.9].CGColor;
        NSObject* transparentColor = (NSObject*)[UIColor colorWithWhite:1.0 alpha:0.0].CGColor;

        gradientLayer.colors = [NSArray arrayWithObjects:transparentColor, fadeColor, nil];
        gradientLayer.locations = [NSArray arrayWithObjects:
                               [NSNumber numberWithFloat:0.5],
                               [NSNumber numberWithFloat:1.0], nil];

        gradientLayer.bounds = self.bounds;
        gradientLayer.anchorPoint = CGPointZero;

        [self.layer addSublayer:gradientLayer];
    }
}

【问题讨论】:

  • layoutSubviews 应该只做一件事——调整视图子视图的边界/框架。就是这样。不应在那里进行任何其他类型的更改。
  • @rmaddy 感谢您的评论。还有适合渐变的地方吗?
  • 您只希望图层添加一次。在init... 方法中添加它。仅在layoutSubviews 中调整其大小。
  • layoutSubviews 每次调用。因此,如果您更改框架或其他内容,它将无法正常工作

标签: ios objective-c layout calayer subview


【解决方案1】:

我的两分钱类似的问题。希望可以帮助别人。 在调试了一下之后,我注意到 ALSO 添加 CALayer 会重新调用 layoutSubviews

所以如果你打电话:

    self.layer.addSublayer(anotherLayer)

您将在 layoutSubviews 中被重新调用。

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多