ibireme / YYText

Powerful text framework for iOS to display and edit rich text.
MIT License
8.86k stars 1.7k forks source link

YYLabel shadow Issue #122

Closed 100mango closed 8 years ago

100mango commented 8 years ago

两种设置阴影的方式

1.

  label.text = model.content;
  label.shadowOffset = CGSizeMake(1, 1);
  label.shadowBlurRadius = 8;
  label.shadowColor = [UIColor blackColor];

2.

 NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:model.content];
  YYTextShadow *shadow = [YYTextShadow new];
  shadow.offset = CGSizeMake(1, 1);
  shadow.radius = 8;
  shadow.color = [UIColor blackColor];
  text.yy_textShadow = shadow;
  label.attributedText = text;

第一种没有效果 第二种有效果

如果阴影超出Label bounds,阴影被截。 已设置

   label.layer.masksToBounds = NO;
ibireme commented 8 years ago

嗯。。第一种貌似是有 bug。。我改一下。。

YYText 的阴影,是绘制成图片的,所以超出视图范围的部分是不会有阴影的。解决方法有两个:

  1. 扩大 Label 的空白范围,比如用 textContainerInset 属性来增加边距。
  2. 用 CALayer 的 shadow 属性,但这会降低图形性能。
100mango commented 8 years ago

用 CALayer 的 shadow 属性,但这会降低图形性能。

ibireme君。 测试了一下直接设置layer的shadow相关属性,没有效果。 是否可以考虑在YYTextDrawShadow 根据shadow的半径来适当扩大边距和修改偏移point。 这样和clipToBounds应该就无缝连接了,同时不需要使用者修改其他属性。

ibireme commented 8 years ago

CALayer 的 shadow 属性是由系统支持的,下面是我的测试代码:

label.layer.shadowColor = [UIColor blackColor].CGColor;
label.layer.shadowOffset = CGSizeMake(0, 1);
label.layer.shadowRadius = 3;
label.layer.shadowOpacity = 0.5;

CALayer 这个阴影,应该是由 GPU 绘制的,能溢出到视图外。但是文本显示的时候,最终是绘制成 CGImage 的,如果想要扩大阴影范围,那需要更大的画布和更多的内存。这很难把 CGImage 按那种模式放入视图来显示,另外阴影的边界也非常难以确定。。

UILabel 显示 attributedText 中的 NSShadow 时,也是这样。。