Я пробовал так много решений с этой должности и в итоге получил решение ниже. Это полнофункциональное решение, если вам не нужно опускать тень на четкое цветовое представление.
- (void)addShadowWithRadius:(CGFloat)shadowRadius withOpacity:(CGFloat)shadowOpacity withOffset:(CGSize)shadowOffset withColor:(UIColor *)shadowColor withCornerradius:(CGFloat)cornerRadius
{
UIView *viewShadow = [[UIView alloc]initWithFrame:self.frame];
viewShadow.backgroundColor = [UIColor whiteColor];
viewShadow.layer.shadowColor = shadowColor.CGColor;
viewShadow.layer.shadowOffset = shadowOffset;
viewShadow.layer.shadowRadius = shadowRadius;
viewShadow.layer.shadowOpacity = shadowOpacity;
viewShadow.layer.cornerRadius = cornerRadius;
viewShadow.layer.masksToBounds = NO;
[self.superview insertSubview:viewShadow belowSubview:self];
[viewShadow setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0]];
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:viewShadow attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:viewShadow attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];
[self layoutIfNeeded];
self.layer.cornerRadius = cornerRadius;
self.layer.masksToBounds = YES;
}
Существует обозначение класса символов POSIX [: print:]
, которое должно соответствовать печатаемым символам, и [: cntrl:]
для управляющих символов. Обратите внимание, что эти коды соответствия во всей таблице ASCII, поэтому они могут не подходить для сопоставления других кодировок.
В противном случае выражение [\ x00- \ x1f]
будет соответствовать через управляющие символы ASCII, хотя, опять же, их можно было распечатать в других кодировках.
В Java , параметр \ p {Print}
указывает класс печатаемых символов .
Это сильно зависит от того, какой пакет регулярных выражений вы используете. Это одна из тех ситуаций, о которых некоторые шутки говорили, что самое замечательное в стандартах - это то, что есть из чего выбирать.
Если вы используете C, функция isprint (3)
/ макрос - ваш друг.
Если ваш вариант регулярного выражения поддерживает свойства Unicode , это, вероятно, лучший способ:
\P{Cc}
Соответствует любому символу это не управляющий символ, будь то ASCII - [\ x00- \ x1F \ x7F]
- или Latin1 - [\ x80- \ x9F]
(также известный как управляющие символы C1).
Проблема с классами POSIX, такими как [: print:]
или \ p {Print}
, заключается в том, что они могут сопоставлять разные вещи в зависимости от типа регулярного выражения и, возможно, от локали. настройки базовой платформы. В Java они строго ориентированы на ASCII. Это означает, что \ p {Print}
соответствует только печатным символам ASCII - [\ x20- \ x7E]
- тогда как \ P {Cntrl}
(примечание заглавная 'P') соответствует всему, что не управляющий символ ASCII - [^ \ x00- \ x1F \ x7F]
. То есть он соответствует любому символу ASCII, не являющемуся управляющим, или любому символу, отличному от ASCII, включая управляющие символы C1.