Тень UITextField не отображается при редактировании

Я хочу нарисовать текст в UITextField с тенью. Для этого я подклассифицировал UITextField и реализовал метод drawTextInRect: :

 - (void)drawTextInRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // Create shadow color float colorValues[] = {0.21875, 0.21875, 0.21875, 1.0}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorRef shadowColor = CGColorCreate(colorSpace, colorValues); CGColorSpaceRelease(colorSpace); // Create shadow CGSize shadowOffset = CGSizeMake(2, 2); CGContextSetShadowWithColor(context, shadowOffset, 0, shadowColor); CGColorRelease(shadowColor); // Render text [super drawTextInRect:rect]; } 

Это отлично работает, когда текстовое поле не редактируется, но как только начинается редактирование, тень исчезает. Есть что-то, чего я не вижу?

5 Solutions collect form web for “Тень UITextField не отображается при редактировании”

Вот код для следующего компонента

введите описание изображения здесь

 @interface AZTextField () - (void)privateInitialization; @end @implementation AZTextField static CGFloat const kAZTextFieldCornerRadius = 3.0; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (!self) return nil; [self privateInitialization]; return self; } // In case you decided to use it in a nib - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (!self) return nil; [self privateInitialization]; return self; } - (void)privateInitialization { self.borderStyle = UITextBorderStyleNone; self.layer.masksToBounds = NO; self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowOffset = CGSizeMake(0.0f, 5.0f); self.layer.shadowOpacity = 0.5f; self.layer.backgroundColor = [UIColor whiteColor].CGColor; self.layer.cornerRadius = 4; // This code is better to be called whenever size of the textfield changed, // so if you plan to do that you can add an observer for bounds property UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:kAZTextFieldCornerRadius]; self.layer.shadowPath = shadowPath.CGPath; } @end 

Несколько вещей, чтобы рассмотреть:

  • Вы хотите установить borderStyle равным none, иначе вы получите UIKit, помещающий subviews в ваше текстовое поле
  • В зависимости от версии Xcode вы можете связать QuartzCore и с #import <QuartzCore/QuartzCore.h>
  • Для более сложного внешнего вида вы все равно можете использовать теневые свойства слоя и переместить сам код чертежа в метод drawRect: но jake_hetfield был прав, если вы переопределите drawRect, вы не хотите называть super, особенно в конце метода
  • Что касается текстового чертежа (вы можете видеть, что он близок к границам компонентов), у вас есть отдельный drawTextInRect: и drawPlaceholderInRect: метод, который рисует текст и заполнитель соответственно
  • Вы можете использовать метод UIColor для цветов и вызывать свойство CGColor, что делает код более читаемым и более простым в обслуживании

Надеюсь, это поможет!

Вдохновленный ответом @jake_hetfield, я создал пользовательский UITextField который использует внутреннюю метку для рисования, проверьте:

ShadowTextField .h

 #import <UIKit/UIKit.h> @interface ShadowTextField : UITextField // properties to change the shadow color & offset @property (nonatomic, retain) UIColor *textShadowColor; @property (nonatomic) CGSize textShadowOffset; - (id)initWithFrame:(CGRect)frame font:(UIFont *)font textColor:(UIColor *)textColor shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset; @end 

ShadowTextField .m

 #import "ShadowTextField.h" @interface ShadowTextField () @property (nonatomic, retain) UILabel *internalLabel; @end @implementation ShadowTextField @synthesize internalLabel = _internalLabel; @synthesize textShadowColor = _textShadowColor; @synthesize textShadowOffset = _textShadowOffset; - (id)initWithFrame:(CGRect)frame font:(UIFont *)font textColor:(UIColor *)textColor shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset { self = [super initWithFrame:frame]; if (self) { // Initialization code // register to my own text changes notification, so I can update the internal label [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUITextFieldTextDidChangeNotification) name:UITextFieldTextDidChangeNotification object:nil]; self.font = font; self.textColor = textColor; self.textShadowColor = shadowColor; self.textShadowOffset = shadowOffset; } return self; } // when the user enter text we update the internal label - (void)handleUITextFieldTextDidChangeNotification { self.internalLabel.text = self.text; [self.internalLabel sizeToFit]; } // init the internal label when first needed - (UILabel *)internalLabel { if (!_internalLabel) { _internalLabel = [[UILabel alloc] initWithFrame:self.bounds]; [self addSubview:_internalLabel]; _internalLabel.font = self.font; _internalLabel.backgroundColor = [UIColor clearColor]; } return _internalLabel; } // override this method to update the internal label color // and to set the original label to clear so we wont get two labels - (void)setTextColor:(UIColor *)textColor { [super setTextColor:[UIColor clearColor]]; self.internalLabel.textColor = textColor; } // override this method to update the internal label text - (void)setText:(NSString *)text { [super setText:text]; self.internalLabel.text = self.text; [self.internalLabel sizeToFit]; } - (void)setTextShadowColor:(UIColor *)textShadowColor { self.internalLabel.shadowColor = textShadowColor; } - (void)setTextShadowOffset:(CGSize)textShadowOffset { self.internalLabel.shadowOffset = textShadowOffset; } - (void)drawTextInRect:(CGRect)rect { // don't draw anything // we have the internal label for that... } - (void)dealloc { [_internalLabel release]; [_textShadowColor release]; [super dealloc]; } @end 

Вот как вы используете его в своем контроллере вида

 - (void)viewDidLoad { [super viewDidLoad]; ShadowTextField *textField = [[ShadowTextField alloc] initWithFrame:CGRectMake(0, 0, 320, 30) font:[UIFont systemFontOfSize:22.0] textColor:[UIColor whiteColor] shadowColor:[UIColor redColor] shadowOffset:CGSizeMake(0, 1) ] ; textField.text = @"This is some text"; textField.backgroundColor = [UIColor blackColor]; [self.view addSubview:textField]; } 

Вы можете сами попытаться сделать рисунок этикетки. Удалить

 [super drawTextInRect:rect] 

И вместо этого нарисуйте свой собственный ярлык. Я не пробовал это, но мог выглядеть примерно так:

 // Declare a label as a member in your class in the .h file and a property for it: UILabel *textFieldLabel; @property (nonatomic, retain) UILabel *textFieldLabel; // Draw the label - (void)drawTextInRect:(CGRect)rect { if (self.textFieldLabel == nil) { self.textFieldLabel = [[[UILabel alloc] initWithFrame:rect] autorelease]; [self.view addSubview:myLabel]; } self.textFieldLabel.frame = rect; self.textFieldLabel.text = self.text; /** Set the style you wish for your label here **/ self.textFieldLabel.shadowColor = [UIColor grayColor]; self.textFieldLabel.shadowOffset = CGSizeMake(2,2); self.textFieldLabel.textColor = [UIColor blueColor]; // Do not call [super drawTextInRect:myLabel] method if drawing your own text } 

Прекратите называть супер и визуализировать текст самостоятельно.

Попробовали ли вы со стандартными теневыми свойствами CALayer? его обычно достаточно, и это намного проще. Попробуйте что-то подобное с помощью регулярного UITextField:

 self.inputContainer.layer.shadowColor=[UIColor blackColor].CGColor; self.inputContainer.layer.shadowRadius=8.0f; self.inputContainer.layer.cornerRadius=8.0f; self.inputContainer.layer.shadowOffset=CGSizeMake(0, 4); 

Сначала вам нужно импортировать QuartzCore!

 #import <QuartzCore/QuartzCore.h> 
  • UIScrollView с прокруткой «Циркуляр»
  • Динамическое обертывание текста вокруг нескольких UIImageView
  • Как я могу программно уволить / отключить всплывающее окно, которое было введено в iOS 11?
  • Добавление границы с шириной в UIView показывает небольшой фон вне
  • UIImagePickerController Снятая с хранения память
  • Производительность UIView: непрозрачная, backgroundColor, cleararsContextBeforeDrawing?
  • Проблемы скорости в setTranslation: inView:
  • Настроить UISegmentedControl на iOS 8
  • Как вы предотвращаете перекрытие автокоррекции UITextField с помощью inputAccessoryView?
  • Нарисуйте пунктирную (не пунктирную) линию, с IBDesignable в 2017 году
  • iOS - Инструменты Обнаружение зомби, не помогающее
  • Interesting Posts

    Кордова пытается набрать номер телефона

    MFMessageComposeViewController не отображает значок камеры

    Как загрузить приложение iOS 6, которое может работать на iOS 7 с iOS legacy Look

    iOS: в App Purchase управление несколькими автоматически возобновляемыми подписками с возможностью обновления и понижения

    Как настроить первый запуск приложения iOS

    Проверка покупки в приложении

    didReceiveRemoteNotification не будет вызвана

    Где находятся файлы заголовков ios SDK? и где OSX?

    cellForRowAtIndexPath: UILabel перекрывается после прокрутки

    Переход между несколькими раскадровками в XCode 4

    Ошибка тестирования пользовательского интерфейса: не удалось обновить требуемую ориентацию

    Невозможно получить данные с использованием данных ядра

    ReplayKit не работает в коде проекта iOS SpriteKit

    Получить широту и долготу на основе zip, используя класс Geocoder в IOS

    Проблема в UITextField добавляет внутри UIImageView в iPhone?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.