Создайте тень с помощью QuartzCore для UITextView

Я создал тень, используя QuartzCore для моего UITextView с помощью следующего кода.

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;

Он создает shadow и looks good too. Вот мой вывод для приведенного выше кода.

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

Но когда я пытаюсь добавить текст в myTextView, мой текст textView выходит за границы и выглядит за пределами myTextView, как показано ниже.

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

Это происходит только при добавлении тени. Текст внутри textView не выглядит странно, если я не добавляю тень. Что я делаю не так?? Как я мог преодолеть это? Почему это происходит?

ОБНОВЛЕНИЕ:

@borrrden сказал, что я обнаружил Это происходит из-за установки maskToBounds = NO; Если мы установим YES, мы не сможем получить тень. Причина Здесь это ответ


person Dinesh Raja    schedule 22.11.2012    source источник
comment
masksToBounds устанавливается на NO. Без этого представление не будет пытаться обрезать свое содержимое.   -  person borrrden    schedule 22.11.2012
comment
Если я установлю myTextView.layer.masksToBounds = YES;, то тень не будет отображаться.   -  person Dinesh Raja    schedule 22.11.2012
comment
Попробуйте установить для textView.contentInset подходящее значение, чтобы оно не перекрывалось.   -  person iDev    schedule 22.11.2012
comment
@ACB Нет. Я думаю, что это не имеет ничего общего с contentInset. Вставка содержимого предназначена только для того, чтобы освободить место со всех сторон. Во всяком случае, я попробовал, как вы сказали, и это ничего не меняет.   -  person Dinesh Raja    schedule 22.11.2012


Ответы (3)


Нет «правильного» решения из-за поведения UIView. Если для masksToBounds установлено значение NO, все подслои, выходящие за границы слоя, будут видны. А UITextField прокручивает текст вне слоя UITextField.

Добавьте четкое представление за UITextView и добавьте на него тень.

person AntonPalich    schedule 22.11.2012
comment
Что вы подразумеваете под четким представлением? Что делать, если у меня есть другой супервизор за textView ?? - person Dinesh Raja; 22.11.2012
comment
Я думаю, что он имел в виду добавить отдельный UIVIew в качестве представления контейнера за текстовым представлением и придать ему эффект тени. Если вы используете это текстовое представление в нескольких местах, возможно, вы можете создать подкласс UIVIew и добавить текстовое представление в качестве подвида в пользовательской реализации. +1 за предложение. - person iDev; 22.11.2012
comment
@ACB Но на самом деле я пытаюсь добавить тень для своего текстового просмотра. Но вы предлагаете альтернативное решение. Я уже знаю, как добавить UIView позади textView, чтобы он выглядел так, как я хотел. Во всяком случае, это ответ на мой вопрос как я могу это преодолеть?. Но почему мне нравится мой результат? Что делать, если я хочу добавить тень только к textView? Что делать, если у меня большое количество textViews?? Затем мне нужно создать большое количество UIViews нежелательно и сделать для них выходы... - person Dinesh Raja; 22.11.2012
comment
+1 за предложение иметь альтернативный способ .. - person Dinesh Raja; 22.11.2012
comment
@ RA Нет правильного решения из-за поведения UIView. Если для masksToBounds установлено значение NO, все подслои, выходящие за границы слоя, будут видны. А UITextField прокручивает текст вне слоя UITextField. - person AntonPalich; 22.11.2012
comment
Это ужасная правда. - person Matt Becker; 09.08.2013

Просто добавьте еще один UIView под свой textView и установите его слой для отображения тени (не забудьте установить цвет фона на что-то другое, кроме чистого цвета, иначе тень не будет нарисована)

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];
person Oladya Kane    schedule 22.11.2012
comment
Мне нужно добавить тень в textView, а не в представление контейнера. Не могли бы вы помочь мне с моим выводом, почему это происходит, когда я добавляю тень в свой textView?? - person Dinesh Raja; 22.11.2012
comment
+1 за предложение иметь альтернативный способ .. - person Dinesh Raja; 22.11.2012

В дополнение к предыдущему ответу просто скопируйте все атрибуты из исходного 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];
person Ing. Ron    schedule 07.02.2017