1

在 iOS 7 中,当UIPickerViews 靠近边缘时,文本上有一个很好的阴影:

在此处输入图像描述

如果我使用的是 UIScrollView,是否可以实现类似的效果,其中边缘的文本略微阴影/混合到背景中?

4

3 回答 3

1

请参阅此处此处了解我对类似问题的回答。

我的解决方案是子类UIScrollView化,并在方法中创建一个遮罩层layoutSubviews

上述答案中的代码也在github 上

希望有帮助!

于 2013-11-06T05:46:40.760 回答
0

我对这个类做了类似的事情来淡化滚动选框的左右边缘。比使用两张图片更省事,因为您可以轻松调整大小或重新着色:

@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 之间的淡入淡出宽度以及与背景匹配的颜色来初始化一个,然后添加到父视图中。

于 2013-11-05T14:40:40.057 回答
-1

我会为此放置两个自定义覆盖视图,您将它们放置在滚动视图的顶部。视图可以包含从全白渐变到 alpha 为 0 的预制图像,或者您可以使用 Core Graphics 或CAGradientLayer.

如果您设置userInteractionEnabled = NO;视图,它们不会干扰触摸处理。

于 2013-11-05T13:47:50.827 回答