2015-05-20 3 views
4

Я пытаюсь посмотреть, есть ли способ создать UIView с a shadow behavior compliant with material design. Я понимаю, что тень становится более интенсивной, так как объект удаляется с поверхности фона.iOS - как создать «дизайн материала», совместимый с UIView с тенью?

Я могу вручную добавить тень как это, однако эта тень не вычисляет, насколько интенсивной должна быть тень (на основе порядка Z).

button.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:button.layer.bounds cornerRadius:11].CGPath; 
    button.layer.shadowOpacity = 1.0; 
    button.layer.shadowOffset = CGSizeMake(1,1); 
    button.layer.shadowColor = [UIColor blackColor].CGColor; 

Как создать UIView, который будет вести себя как дизайн материала Google? я found this example, called Material Kit, однако он просто скрывает тень на ощупь

Один из способов, в котором Google делает это, подчеркивая использование «оси», чтобы создать ощущение глубины, в которой элементы могут занимать разных уровнях. Чтобы показать, что элемент занимает более высокий уровень по оси z, вокруг его границы используются тени, которые находятся на уровне ниже. Это создает иллюзию интерактивного слоя/элемента , который существует над другим, более низким интерактивным слоем/элементом.

enter image description here

+0

Я думаю, что вопрос не так сильно связан с теневым, что является просто визуальным эффектом, но больше о том, как вы определяете «поддельную z». На каком уровне находятся объекты. Так, это с длинной прессой? Например, чем больше вы поддерживаете свой UIView, тем больше z должно расти (до предела)? Затем речь идет о вычислении «продолжительного времени печати». – Larme

+0

Для времени долгого пресса BFPaperButton имеет хорошее решение - «круглая кружка» вырастает до определенного максимума при длительном нажатии и остается там, но просто рябь и крана на кране. –

+0

sem related: у меня были проблемы с производительностью с использованием свойства shadow 'UIViews', если у них довольно много элементов на экране. было бы разумнее иметь UIImage с испеченным в тени, который является фоном контейнера, который вы помещаете в свой элемент, чтобы придать ему вид тени, без необходимости его отображения слоем. – Fonix

ответ

7

Вы можете создать подкласс UIButton и первый набор теневых свойств по своему вкусу:

button.layer.shadowOffset = CGSizeMake(0, 1); 
button.layer.shadowRadius = 5; 
button.layer.shadowOpacity = 0; 

Затем измените shadowOpacity свойство, когда подсвеченные изменения состояния:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    [super setHighlighted:highlighted]; 
    self.layer.shadowOpacity = (highlighted ? 0.85 : 0); 
} 
+0

Но это будет работать, если maskToBounds = NO, в случае радиуса Корнера нам нужно будет переключить MaskToBounds на YES, в этом случае эта тень также будет замаскирована. – Mrug

0

Чтобы применить как тень, так и закругленный угол, вам нужно использовать 2 вложенных представления. Это связано с тем, что для двух эффектов требуются конкурирующие свойства masksToBounds.

Гнездо 2 UIViews. Примените тень к внешнему виду, установив masksToBounds = false. Затем нанесите округленный угол на внутренний вид, который требует masksToBounds = true.

Обратите внимание, что в соответствии с документами Apple masksToBounds эквивалентно clipsToBounds.

Смежные вопросы