将CAGradient掩码层应用于UITextView

Mik*_*ein 4 objective-c uitextview cagradientlayer

我有一个带可滚动文本的UITextView.我正在尝试对其应用渐变图层,因此可见文本的底部总是略微淡出.

这是我的代码:

CAGradientLayer *maskLayer = [CAGradientLayer layer];

maskLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor clearColor] CGColor], (id)[[UIColor yellowColor] CGColor], nil];
maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
                       [NSNumber numberWithFloat:0.2],
                       [NSNumber numberWithFloat:0.8],
                       [NSNumber numberWithFloat:1.0], nil];
maskLayer.bounds = clueTextView.bounds;
myUITextView.layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)

现在,这导致UITextViewLayer完全透明 - 我看到UITextViewLayer作为子视图的UIView的背景颜色.虽然我可以选择并复制文本以粘贴到notes程序中,但我看不到其中包含的任何文本.

我缺少什么想法?

rob*_*off 12

你有几个问题.

渐变图层的colors属性需要与其locations属性具有相同的计数.您提供4个位置,但只有2种颜色.

您正在设置渐变图层的边界,clueTextView但您将其设置为蒙版myUITextView.

您正在设置bounds渐变图层,但不是它position.默认position值为0,0,表示渐变图层的中心位于左上角myUITextView.只需将frame渐变图层设置bounds为文本视图即可.

如果你解决了所有这些问题,你可能会得到你正在寻找的效果.

- (void)initTextViewMask {
    CAGradientLayer *maskLayer = [CAGradientLayer layer];
    maskLayer.colors = @[
        (id)[UIColor whiteColor].CGColor,
        (id)[UIColor whiteColor].CGColor,
        (id)[UIColor clearColor].CGColor];
    maskLayer.locations = @[ @0.0f, @0.8f, @1.0f ];
    maskLayer.frame = textView_.bounds;
    textView_.layer.mask = maskLayer;
}
Run Code Online (Sandbox Code Playgroud)

但是,您可能会发现新问题.

如果用户可以滚动文本视图,您将发现渐变随文本视图移动,这可能不是您想要的.解决此问题的最简单方法是将文本视图嵌入容器中UIView,并在容器视图上设置掩码.

如果文本视图可以更改大小(可能是由于设备旋转),则掩码不会自动更改大小.你需要framelayoutSubviews或中更新掩码viewDidLayoutSubviews.