使用QuartzCore为UITextView创建阴影

时间:2012-11-22 05:59:11

标签: ios uitextview shadow quartz-core

我使用以下代码使用QuartzCoreUITextView创建了一个阴影。

myTextView.layer.masksToBounds = NO;
myTextView.layer.shadowColor = [UIColor blackColor].CGColor;
myTextView.layer.shadowOpacity = 0.7f;
myTextView.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
myTextView.layer.shadowRadius = 8.0f;
myTextView.layer.shouldRasterize = YES;

它会创建shadowlooks good too.这里是上述代码的输出。

enter image description here

但是当我尝试向myTextView添加文本时,我的textView文本超出了界限,它看起来像myTextView之外,如下所示。

enter image description here

只有在我添加阴影时才会发生这种情况。 textView内的文字并没有显示出奇怪的内容如果我不添加阴影。我做错了什么?我怎么能克服这个?为什么会这样?

更新

@borrrden说 我发现它正在发生,因为设置maskToBounds = NO;如果我们设置YES那么我们就无法获得阴影。原因这是answer

3 个答案:

答案 0 :(得分:6)

由于UIView行为,没有“正确”的解决方案。当masksToBounds为NO时,任何延伸到图层边界外的子图层都将可见。 UITextField在UITextField图层外滚动文本。

在UITextView后面添加清晰视图并在其上放一个阴影。

答案 1 :(得分:2)

只需在textView下添加另一个UIView并设置它的图层以显示阴影(不要忘记将其背景颜色设置为除了清晰颜色以外的其他颜色 - 或者不会绘制阴影)

myTextView = [UITextView alloc] initWithFrame:CGRectMake(100,100,200,200);
UIView* shadowView = [UIView alloc] initWithFrame:myTextView.frame];
shadowView.backgroundColor = myTextView.backgroundColor;
shadowView.layer.masksToBounds = NO;
shadowView.layer.shadowColor = [UIColor blackColor].CGColor;
shadowView.layer.shadowOpacity = 0.7f;
shadowView.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
shadowView.layer.shadowRadius = 8.0f;
shadowView.layer.shouldRasterize = YES;
[someView addSubview:shadowView];
[someView addSubView:myTextView];

答案 2 :(得分:1)

除了上一个答案,只需将原始uiTextView中的所有属性复制到帮助器视图:

UITextView *helperTextView = [[UITextView alloc] init];
helperTextView = textView;  //copy all attributes to the helperTextView;

shadowTextView = [[UIView alloc] initWithFrame:textView.frame];
shadowTextView.backgroundColor = textView.backgroundColor;
shadowTextView.layer.opacity = 1.0f;
shadowTextView.layer.masksToBounds = NO;
shadowTextView.layer.shadowColor = [UIColorFromRGB(0x00abff)CGColor];
shadowTextView.layer.shadowOpacity = 1.0f;
shadowTextView.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
shadowTextView.layer.shadowRadius = 10.0f;
shadowTextView.layer.cornerRadius = 8.0f;
shadowTextView.layer.shouldRasterize = YES;

[self.view addSubview:shadowTextView];
[self.view addSubview:helperTextView];