在UITextField文本上删除阴影

Dot*_*ash 54 iphone objective-c shadow uitextfield uikit

是否可以在文本中添加阴影UITextField

小智 176

从3.2开始,您可以使用CALayer阴影属性.

_textField.layer.shadowOpacity = 1.0;   
_textField.layer.shadowRadius = 0.0;
_textField.layer.shadowColor = [UIColor blackColor].CGColor;
_textField.layer.shadowOffset = CGSizeMake(0.0, -1.0);
Run Code Online (Sandbox Code Playgroud)

  • 确实,最简单的解决方案.你需要`#import <QuartzCore/QuartzCore.h>`才能工作. (15认同)

dea*_*rne 72

我有一个稍微不同的问题 - 我想在UILabel上模糊阴影.幸运的是,对此的解决方案原来是泰勒的数字(2)

这是我的代码:

- (void) drawTextInRect:(CGRect)rect {
    CGSize myShadowOffset = CGSizeMake(4, -4);
    CGFloat myColorValues[] = {0, 0, 0, .8};

    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(myContext);

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues);
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);

    [super drawTextInRect:rect];

    CGColorRelease(myColor);
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext);
}
Run Code Online (Sandbox Code Playgroud)

这是一个从UILabel延伸的类,并向下绘制带有阴影的文本到右边的4px,阴影是80%不透明度的灰色,并且模糊不清.

我认为Tyler的2号解决方案在性能上要比Tyler的1号好一点 - 你只是在视图中处理一个UILabel而且假设你没有重新绘制每一帧,那么渲染性能并不比正常的UILabel.

PS此代码大量借鉴了Quartz 2D文档


Tyl*_*ler 19

我不认为你在这里得到了对文本阴影的内置支持UILabel.

两个想法:

(1)[编码方式比较复杂.]UITextField在原点后面添加一秒,偏移量非常小(可能是(0.2,0.8)?).通过textField:shouldChangeCharactersInRange:replacementString:UITextFieldDelegate协议中实现方法,您可以逐个键地监听每个文本更改.使用它,您可以同时更新下部文本.您还可以将较低的文本(阴影文本)设置为灰色,甚至使用分数偏移文本显示模糊的事实稍微模糊.补充:哦,是的,[UIColor clearColor]如果你采用这个想法,不要忘记设置顶部文本字段的背景颜色.

(2)[代码更有趣.]子类UITextField并覆盖该drawRect:方法.我之前没有这样做,所以我前面会提到这取决于这是指定的绘图方法,并且可能会发现你必须覆盖另一个绘图函数,例如drawTextInRect:,特定于UITextField.现在设置了绘图上下文通过绘制阴影CGContextSetShadow功能,并调用[super drawRect:rect];.希望这有效 - 如果原始UITextField代码清除了绘图上下文的阴影参数,那么这个想法就会被剔除,你必须自己编写整个绘图代码,我反对推荐,因为所有附加内容都UITextFields像复制一样日语中的粘贴和汉字输入.

  • 你肯定应该使用egarc下面的答案,更好的方法来解决这个问题! (2认同)

cno*_*gr8 16

虽然直接应用阴影的方法UITextView会起作用,但这样做是错误的.通过使用清晰的背景颜色直接添加阴影,所有子视图都将获得阴影,甚至是光标.

应该使用的方法是NSAttributedString.

NSMutableAttributedString* attString = [[NSMutableAttributedString alloc] initWithString:textView.text];
NSRange range = NSMakeRange(0, [attString length]);

[attString addAttribute:NSFontAttributeName value:textView.font range:range];
[attString addAttribute:NSForegroundColorAttributeName value:textView.textColor range:range];

NSShadow* shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor whiteColor];
shadow.shadowOffset = CGSizeMake(0.0f, 1.0f);
[attString addAttribute:NSShadowAttributeName value:shadow range:range];

textView.attributedText = attString;
Run Code Online (Sandbox Code Playgroud)

但是textView.attributedText适用于iOS6.如果必须支持较低版本,则可以使用以下方法.(别忘了添加#import <QuartzCore/QuartzCore.h>)

CALayer *textLayer = (CALayer *)[textView.layer.sublayers objectAtIndex:0];
textLayer.shadowColor = [UIColor whiteColor].CGColor;
textLayer.shadowOffset = CGSizeMake(0.0f, 1.0f);
textLayer.shadowOpacity = 1.0f;
textLayer.shadowRadius = 0.0f;
Run Code Online (Sandbox Code Playgroud)

  • 钻石在粗略回答.这比设置CALayer阴影属性要快得多. (3认同)
  • 如果添加`shadow.shadowBlurRadius = 6.f;`,这也适用于将阴影添加到阴影中 (2认同)