【发布时间】: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