关于 ios:尝试使用 UIScrollView 创建自定义水平 UIPickerView – 如何像在 UIPickerView 中那样淡出边缘?

Trying to create a custom horizontal UIPickerView using UIScrollView - how do I fade the edges out like in UIPickerView?

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

enter

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

我的解决方案是继承UIScrollView,并在layoutSubviews方法中创建一个遮罩层。

上面答案中的代码也在github上。

希望有帮助!


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@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;,它们将不会干扰触摸处理。