在 iOS 7 中,当UIPickerView
s 靠近边缘时,文本上有一个很好的阴影:
如果我使用的是 UIScrollView,是否可以实现类似的效果,其中边缘的文本略微阴影/混合到背景中?
在 iOS 7 中,当UIPickerView
s 靠近边缘时,文本上有一个很好的阴影:
如果我使用的是 UIScrollView,是否可以实现类似的效果,其中边缘的文本略微阴影/混合到背景中?
我对这个类做了类似的事情来淡化滚动选框的左右边缘。比使用两张图片更省事,因为您可以轻松调整大小或重新着色:
@interface MarqueeFadeOverlay : UIView
@property(assign, nonatomic) CGGradientRef gradientLayer;
- (id)initWithFrame:(CGRect)frame andEndFadeWidth:(float)fadeWidth andFadeBarColor:(UIColor *)color;
@end
@implementation MarqueeFadeOverlay {
UIColor *fadeBarColor;
float endFadeWidth;
}
- (id)initWithFrame:(CGRect)frame andEndFadeWidth:(float)fadeWidth andFadeBarColor:(UIColor *)color {
self = [super initWithFrame:frame];
if (self) {
endFadeWidth = fadeWidth;
fadeBarColor = color;
[self setOpaque:NO];
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawLinearGradient(context, self.gradientLayer, CGPointMake(0.0, 0.0),
CGPointMake(self.frame.size.width, 0.0), kCGGradientDrawsBeforeStartLocation);
}
- (CGGradientRef)gradientLayer {
if (_gradientLayer == nil) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat *colorComponents = [self rgbaFrom:fadeBarColor];
if (endFadeWidth == 0) endFadeWidth = 0.1;
CGFloat locations[] = {0.0, endFadeWidth, 1.0 - endFadeWidth, 1.0};
CGFloat colors[] = {colorComponents[0], colorComponents[1], colorComponents[2], 1.00,
colorComponents[0], colorComponents[1], colorComponents[2], 0,
colorComponents[0], colorComponents[1], colorComponents[2], 0,
colorComponents[0], colorComponents[1], colorComponents[2], 1.00};
_gradientLayer = CGGradientCreateWithColorComponents(colorSpace, colors, locations, sizeof(colors) / (sizeof(colors[0]) * 4));
CGColorSpaceRelease(colorSpace);
}
return _gradientLayer;
}
-(CGFloat *)rgbaFrom:(UIColor *)color {
CGColorRef colorRef = [color CGColor];
return (CGFloat *) CGColorGetComponents(colorRef);
}
您只需使用一个框架、一个介于 0 和 1 之间的淡入淡出宽度以及与背景匹配的颜色来初始化一个,然后添加到父视图中。
我会为此放置两个自定义覆盖视图,您将它们放置在滚动视图的顶部。视图可以包含从全白渐变到 alpha 为 0 的预制图像,或者您可以使用 Core Graphics 或CAGradientLayer
.
如果您设置userInteractionEnabled = NO;
视图,它们不会干扰触摸处理。