Как нарисовать тень под UIView? - PullRequest
345 голосов
/ 30 апреля 2009

Я пытаюсь нарисовать тень под нижним краем UIView в Cocoa Touch. Я понимаю, что мне нужно использовать CGContextSetShadow() для рисования тени, но руководство по программированию в Quartz 2D немного расплывчато:

  1. Сохранить графическое состояние.
  2. Вызвать функцию CGContextSetShadow, передав соответствующие значения.
  3. Выполните все рисунки, к которым вы хотите применить тени.
  4. Восстановление графического состояния

В подклассе UIView я пробовал следующее:

- (void)drawRect:(CGRect)rect {
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
    CGContextRestoreGState(currentContext);
    [super drawRect: rect];
}

.. но это не работает для меня, и я немного застрял в (а), куда идти дальше и (б), если мне нужно что-то сделать с моим UIView, чтобы сделать эту работу?

Ответы [ 14 ]

1 голос
/ 03 октября 2018

Для других Xamarians версия ответа Xamarin.iOS / C # будет выглядеть следующим образом:

public override void DrawRect(CGRect area, UIViewPrintFormatter formatter)
{
    CGContext currentContext = UIGraphics.GetCurrentContext();
    currentContext.SaveState();
    currentContext.SetShadow(new CGSize(-15, 20), 5);
    base.DrawRect(area, formatter);
    currentContext.RestoreState();                
}

Основное отличие состоит в том, что вы получаете экземпляр CGContext, для которого вы напрямую вызываете соответствующие методы.

1 голос
/ 13 сентября 2017

Все Отвечайте все хорошо, но я хочу добавить еще один пункт

Если вы столкнулись с проблемой, когда у вас есть ячейки таблицы, замените новую ячейку на наличие несоответствия в тени, поэтому в этом случае вам нужно поместить код тени в метод layoutSubviews, чтобы он хорошо работал в любых условиях.

-(void)layoutSubviews{
    [super layoutSubviews];

    [self.contentView setNeedsLayout];
    [self.contentView layoutIfNeeded];
    [VPShadow applyShadowView:self];
}

или в ViewControllers для конкретного вида поместите теневой код в следующий метод, чтобы он хорошо работал

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];

    [self.viewShadow layoutIfNeeded];
    [VPShadow applyShadowView:self.viewShadow];
}

Я изменил свою теневую реализацию для новых разработчиков для более обобщенной формы, например:

/*!
 @brief Add shadow to a view.

 @param layer CALayer of the view.

 */
+(void)applyShadowOnView:(CALayer *)layer OffsetX:(CGFloat)x OffsetY:(CGFloat)y blur:(CGFloat)radius opacity:(CGFloat)alpha RoundingCorners:(CGFloat)cornerRadius{
    UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:layer.bounds cornerRadius:cornerRadius];
    layer.masksToBounds = NO;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.shadowOffset = CGSizeMake(x,y);// shadow x and y
    layer.shadowOpacity = alpha;
    layer.shadowRadius = radius;// blur effect
    layer.shadowPath = shadowPath.CGPath;
}
1 голос
/ 13 сентября 2017

Вы можете использовать мою служебную функцию, созданную для тени и радиуса угла, как показано ниже:

- (void)addShadowWithRadius:(CGFloat)shadowRadius withShadowOpacity:(CGFloat)shadowOpacity withShadowOffset:(CGSize)shadowOffset withShadowColor:(UIColor *)shadowColor withCornerRadius:(CGFloat)cornerRadius withBorderColor:(UIColor *)borderColor withBorderWidth:(CGFloat)borderWidth forView:(UIView *)view{

    // drop shadow
    [view.layer setShadowRadius:shadowRadius];
    [view.layer setShadowOpacity:shadowOpacity];
    [view.layer setShadowOffset:shadowOffset];
    [view.layer setShadowColor:shadowColor.CGColor];

    // border radius
    [view.layer setCornerRadius:cornerRadius];

    // border
    [view.layer setBorderColor:borderColor.CGColor];
    [view.layer setBorderWidth:borderWidth];
}

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

1 голос
/ 11 августа 2017

Свифт 3

self.paddingView.layer.masksToBounds = false
self.paddingView.layer.shadowOffset = CGSize(width: -15, height: 10)
self.paddingView.layer.shadowRadius = 5
self.paddingView.layer.shadowOpacity = 0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...