2

也许您知道解决方案,如何在 textView 上添加阴影,例如:

在此处输入图像描述

所以我需要一个透明的textView,我可以在后台看到视图

在此处输入图像描述

4

4 回答 4

5

Apple 提供了CAReplicatorLayer可用于对图层进行自动镜像的工具(除其他外)。这甚至适用于视频层,并且非常高效(直接在 GPU 上执行其绘图)。

CAReplicatorLayer 类创建其子层(源层)的指定数量的副本,每个副本都可能应用几何、时间和颜色转换。

有一个 WWDC 视频( 51:00 左右的Core Animation Essentials)简要介绍了如何使用它,以及一个名为ReplicatorDemo的 OSX 演示项目。

快速搜索会发现一篇博客文章,其中给出了反映层的示例,尽管我没有检查代码/技术的质量。

于 2013-04-08T15:46:25.457 回答
0

我认为您可以结合以下方法(未经测试!):

如何使用 NSString 绘制功能从文本创建 UIImage

UIImage * textImage = [self imageFromText:text];

//You may play with the scale value
UIImage *textImageMirrored = [UIImage imageWithCGImage:[textImage CGImage] scale:1.0 orientation:UIImageOrientationDownMirrored]; 

And then use this mirrored image in the correct position.
UIImageView *textShadow = [[UIImageView alloc] initWithImage:textImageMirrored];
textShadow.opacity = 0.6; //or so
于 2013-04-08T08:35:34.630 回答
0

我过去在白色背景上做过这个,方法是制作一个带有渐变的白色图像,该渐变开始完全不透明并逐渐消失。我将其覆盖在表格视图的底部边缘之上。它使表格视图的外观在底部边缘淡化为白色。

当我到达表格滚动内容的最底部时,我通过让图像向下滑动来解决“底部”问题,这样最后一点就不会消失。

如果您有复杂、移动或多变的背景,这可能不是最佳选择,但对于简单的背景来说效果很好。

于 2013-04-08T14:54:58.863 回答
0

我找到了最好的解决方案。我使用遮罩层和 CAGradientLayer。因此,如果我们将它用于 UITextView,我们的层将是动态的。我创建 UIView,在这个 UIView 上添加我的 UITextView 并为 UIView 使用层

//this float need for creating second sublayer, for scrollIndicator
CGFloat layerWidth = 8.f;
CAGradientLayer *gl1 = [CAGradientLayer layer];
id col1 = (id)[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]CGColor];
id col2 = (id)[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]CGColor];
gl1.colors = @[col2, col1, col1, col2];
gl1.locations = @[@0.0, @0.0, @0.85, @1.0];
//underTextView - this is my UIView
gl1.frame = CGRectMake(0, 0, self.underTextView.width - layerWidth, self.underTextView.height);
//layer for scrollIndicator - it must be visible always good
CAGradientLayer *gl2 = [CAGradientLayer layer];
gl2.colors = @[col1, col1];
gl2.locations = @[@0.0, @1.0];
gl2.frame = CGRectMake(self.underTextView.width - layerWidth, 0, layerWidth, self.underTextView.height);
//create main layer
CAGradientLayer *gl = [CAGradientLayer layer];
[gl addSublayer:gl1];
[gl addSublayer:gl2];
//add to mask of UIView
self.underTextView.layer.mask = gl;

在此处输入图像描述

- (void)scrollViewDidScroll:(UIScrollView *)scrollView然后我在顶部和底部渐变的方法中更改 CAGradientLayer 中颜色的位置。因此,当我打开 textView 时,我看到顶部和底部透明的文本很好,滚动时顶部和底部都透明,滚动到底部时 - 顶部透明,底部不透明

在此处输入图像描述 在此处输入图像描述

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat layerWidth = 8.f;
CAGradientLayer *gl1 = [CAGradientLayer layer];
id col1 = (id)[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]CGColor];
id col2 = (id)[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]CGColor];
gl1.colors = @[col2, col1, col1, col2];
if (self.mainTextView.contentOffset.y < 5)
    gl1.locations = @[@0.0, @0.0, @0.85, @1.0];
if (self.mainTextView.contentOffset.y >=5 && self.mainTextView.contentOffset.y < 20) {
    CGFloat number = (self.mainTextView.contentOffset.y - 5) * 0.01;
    gl1.locations = @[@0.0, [NSNumber numberWithFloat:number], @0.85, @1.0];
}
if (self.mainTextView.contentOffset.y >= 20  && self.mainTextView.contentOffset.y < self.mainTextView.contentSize.height - self.mainTextView.height - 20)
    gl1.locations = @[@0.0, @0.15, @0.85, @1.0];
if (self.mainTextView.contentOffset.y >= (self.mainTextView.contentSize.height - self.mainTextView.height - 20) && self.mainTextView.contentOffset.y < (self.mainTextView.contentSize.height - self.mainTextView.height - 5)) {
    CGFloat number = 1 - (self.mainTextView.contentSize.height - self.mainTextView.contentOffset.y - self.mainTextView.height - 5) * 0.01;
    gl1.locations = @[@0.0, @0.15, [NSNumber numberWithFloat:number], @1.0];
}
if (self.mainTextView.contentOffset.y >= self.mainTextView.contentSize.height - self.mainTextView.height - 5)
    gl1.locations = @[@0.0, @0.15, @1.0, @1.0];
gl1.frame = CGRectMake(0, 0, self.underTextView.width - layerWidth, self.underTextView.height);
CAGradientLayer *gl2 = [CAGradientLayer layer];
gl2.colors = @[col1, col1];
gl2.locations = @[@0.0, @1.0];
gl2.frame = CGRectMake(self.underTextView.width - layerWidth, 0, layerWidth, self.underTextView.height);
CAGradientLayer *gl = [CAGradientLayer layer];
[gl addSublayer:gl1];
[gl addSublayer:gl2];
self.underTextView.layer.mask = gl;
}
于 2013-04-11T06:49:07.647 回答