UIView с закругленными углами и тень?

Я буквально пробовал все, что мог, но никто из них не работал для пользовательского UIView … Мне просто нужен пустой белый вид с закругленными углами и легкой теневой каплей (без эффекта освещения). Я могу сделать каждый из них по одному, но clipToBounds maskToBounds конфликты clipToBounds / maskToBounds .

25 Solutions collect form web for “UIView с закругленными углами и тень?”

Следующий фрагмент кода добавляет границу, радиус границы и тень для v , UIView :

 // border radius [v.layer setCornerRadius:30.0f]; // border [v.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [v.layer setBorderWidth:1.5f]; // drop shadow [v.layer setShadowColor:[UIColor blackColor].CGColor]; [v.layer setShadowOpacity:0.8]; [v.layer setShadowRadius:3.0]; [v.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; 

Вы можете настроить параметры в соответствии с вашими потребностями.

Кроме того, добавьте в проект проект рамки QuartzCore и:

 #import <QuartzCore/QuartzCore.h> 

См. Мой другой ответ о masksToBounds .


Заметка

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

стриж

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

 // corner radius blueView.layer.cornerRadius = 10 // border blueView.layer.borderWidth = 1.0 blueView.layer.borderColor = UIColor.black.cgColor // shadow blueView.layer.shadowColor = UIColor.black.cgColor blueView.layer.shadowOffset = CGSize(width: 3, height: 3) blueView.layer.shadowOpacity = 0.7 blueView.layer.shadowRadius = 4.0 

Изучение вариантов

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

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

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

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

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

Проблема 1: Тень обрезается

Что делать, если есть подслои или подпункты (например, изображение), содержимое которых мы хотим скопировать в рамки нашего представления?

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

Мы можем выполнить это с помощью

 blueView.layer.masksToBounds = true 

(В качестве альтернативы, blueView.clipsToBounds = true дает тот же результат .)

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

Но, о нет! Тень также была обрезана, потому что она находится за пределами границ! Что делать? Что делать?

Решение

Используйте отдельные виды для тени и границы. Основной вид прозрачен и имеет тень. Приграничный вид закрепил любое другое субконтент, которое оно имеет для своих границ.

 // add the shadow to the base view baseView.backgroundColor = UIColor.clear baseView.layer.shadowColor = UIColor.black.cgColor baseView.layer.shadowOffset = CGSize(width: 3, height: 3) baseView.layer.shadowOpacity = 0.7 baseView.layer.shadowRadius = 4.0 // add the border to subview let borderView = UIView() borderView.frame = baseView.bounds borderView.layer.cornerRadius = 10 borderView.layer.borderColor = UIColor.black.cgColor borderView.layer.borderWidth = 1.0 borderView.layer.masksToBounds = true baseView.addSubview(borderView) // add any other subcontent that you want clipped let otherSubContent = UIImageView() otherSubContent.image = UIImage(named: "lion") otherSubContent.frame = borderView.bounds borderView.addSubview(otherSubContent) 

Это дает следующий результат:

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

Проблема 2: Низкая производительность

Добавление закругленных углов и теней может стать хитом производительности. Вы можете повысить производительность, используя предопределенный путь для тени, а также указав, что он растеризован. Следующий код можно добавить к приведенному выше примеру.

 baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath baseView.layer.shouldRasterize = true baseView.layer.rasterizationScale = UIScreen.main.scale 

См. Это сообщение для более подробной информации. См. Здесь и здесь .

Один из способов сделать это – поместить взгляд с закругленными углами в виде тени.

 UIView* roundedView = [[UIView alloc] initWithFrame: frame]; roundedView.layer.cornerRadius = 5.0; roundedView.layer.masksToBounds = YES; UIView* shadowView = [[UIView alloc] initWithFrame: frame]; shadowView.layer.shadowColor = [UIColor blackColor].CGColor; shadowView.layer.shadowRadius = 5.0; shadowView.layer.shadowOffset = CGSizeMake(3.0, 3.0); shadowView.layer.shadowOpacity = 1.0; [shadowView addSubview: roundedView]; 

Затем вы можете добавить shadowView везде, где хотите.

Это сработало для меня. Трюк должен был перемещать цвет фона с основного вида на слой.

 CALayer *layer = view.layer; layer.cornerRadius = 15.0f; layer.masksToBounds = NO; layer.shadowOffset = CGSizeMake(0, 3); layer.shadowColor = [[UIColor blackColor] CGColor]; layer.shadowRadius = 2.0f; layer.shadowOpacity = 0.35f; layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:layer.bounds cornerRadius:layer.cornerRadius] CGPath]; CGColorRef bColor = view.backgroundColor.CGColor; view.backgroundColor = nil; layer.backgroundColor = bColor ; 

Я решил проблему, используя следующий трюк при назначении теневого пути для представления контейнера:

  [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:12] 

Обратите внимание, что путь к тени – это закругленный прямоугольник с тем же угловым радиусом, что и фон, который содержит ячейка:

  //this is the border for the UIView that is added to a cell cell.backgroundView.layer.cornerRadius = 12; cell.backgroundView.layer.masksToBounds = YES; cell.backgroundView.layer.borderColor =[UIColor darkGrayColor].CGColor; cell.backgroundView.layer.borderWidth = 1; //this is the shadow around the cell itself (cannot have round corners with borders and shadow, need to use two views cell.layer.shadowRadius = 2; cell.layer.cornerRadius = 12; cell.layer.masksToBounds = NO; [[cell layer] setShadowColor:[[UIColor darkGrayColor] CGColor]]; [[cell layer] setShadowOffset:CGSizeMake(0,0)]; [[cell layer] setShadowOpacity:1]; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:12]; [[cell layer] setShadowPath:[path CGPath]]; 

Если вы masksToBounds из-за закругленных corners против masksToBounds против masksToBounds , попробуйте использовать мою функцию:

 - (UIView*)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame; // Modify this if needed shadowFrame.size.width = 0.f; shadowFrame.size.height = 0.f; shadowFrame.origin.x = 0.f; shadowFrame.origin.y = 0.f; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; shadow.userInteractionEnabled = NO; // Modify this if needed shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [view.superview insertSubview:shadow belowSubview:view]; [shadow addSubview:view]; return shadow; } 

назовите его на свой взгляд. будет ли ваш взгляд закругленными углами, независимо от его размера, его формы – будет создана красивая тень.

Просто сохраните возвращаемое значение функции, чтобы вы могли ссылаться на нее, когда хотите удалить таблицу (или, например, использовать insertSubview:aboveView:

Простое решение Swift 3.1, основанное на ответе Ада, без каких-либо дополнительных подзапросов, подклассификации или других дополнительных упражнений:

 extension UIView { func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) { let layer = self.layer layer.masksToBounds = false layer.shadowOffset = offset layer.shadowColor = color.cgColor layer.shadowRadius = radius layer.shadowOpacity = opacity //Optional, to improve performance: //layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath let backgroundCGColor = self.backgroundColor?.cgColor self.backgroundColor = nil layer.backgroundColor = backgroundCGColor } } 

Обратите внимание, что перед вызовом addShadow вы должны настроить свой ракурс с угловым радиусом и другими свойствами.

viewDidLoad это прямо из viewDidLoad следующим образом:

 btnBottom.addShadow(offset: CGSize.init(width: 0, height: 3), color: UIColor.black, radius: 2.0, opacity: 0.35) 

Конечный результат:

результат

Супер легко и просто!

Я создал помощника в UIView

 @interface UIView (Helper) - (void)roundCornerswithRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset; @end 

вы можете так называть

 [self.view roundCornerswithRadius:5 andShadowOffset:5]; 

Вот реализация

 - (void)roundCornerswithRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset { const float CORNER_RADIUS = cornerRadius; const float SHADOW_OFFSET = shadowOffset; const float SHADOW_OPACITY = 0.5; const float SHADOW_RADIUS = 3.0; UIView *superView = self.superview; CGRect oldBackgroundFrame = self.frame; [self removeFromSuperview]; CGRect frameForShadowView = CGRectMake(0, 0, oldBackgroundFrame.size.width, oldBackgroundFrame.size.height); UIView *shadowView = [[UIView alloc] initWithFrame:frameForShadowView]; [shadowView.layer setShadowOpacity:SHADOW_OPACITY]; [shadowView.layer setShadowRadius:SHADOW_RADIUS]; [shadowView.layer setShadowOffset:CGSizeMake(SHADOW_OFFSET, SHADOW_OFFSET)]; [self.layer setCornerRadius:CORNER_RADIUS]; [self.layer setMasksToBounds:YES]; [shadowView addSubview:self]; [superView addSubview:shadowView]; } 

После однодневного исследования круглого угла с тенью, я рад опубликовать свой собственный класс uiview здесь, надеюсь закончить этот вопрос:

RoundCornerShadowView.h

 #import <UIKit/UIKit.h> @interface RoundCornerShadowView : UIView @end 

RoundCornerShadowView.m

 #import "RoundCornerShadowView.h" @implementation RoundCornerShadowView // *** must override this method, not the other method *** // otherwise, the background corner doesn't disappear.... // @2015/05/29 -(void) layoutSubviews { [super layoutSubviews];//is must to ensure rightly layout children view //1. first, create Inner layer with content CALayer *innerView = [CALayer layer]; innerView.frame = CGRectMake(0,0,self.bounds.size.width,self.bounds.size.height); //instead of: innerView.frame = self.frame; innerView.borderWidth = 1.0f; innerView.cornerRadius = 6.0f; innerView.masksToBounds = YES; innerView.borderColor = [[UIColor lightGrayColor] CGColor]; innerView.backgroundColor = [[UIColor whiteColor] CGColor]; //put the layer to the BOTTOM of layers is also a MUST step... //otherwise this layer will overlay the sub uiviews in current uiview... [self.layer insertSublayer:innerView atIndex:0]; //2. then, create shadow with self layer self.layer.masksToBounds = NO; self.layer.shadowColor = [[UIColor darkGrayColor] CGColor]; self.layer.shadowOpacity = 0.4f; //shadow length self.layer.shadowRadius = 2.0f; //no offset self.layer.shadowOffset = CGSizeMake(0, 0); //right down shadow //[self.layer setShadowOffset: CGSizeMake(1.0f, 1.0f)]; //3. last but important, MUST clear current view background color, or the color will show in the corner! self.backgroundColor = [UIColor clearColor]; } @end 

поэтому нет необходимости добавлять subview в представлении или ниже в целевом представлении, просто добавьте один слой в текущее представление и сделайте 3 шага, чтобы завершить его!

внимательно ознакомьтесь с комментариями в коде, полезно понять компонент!

Shadow + Border + Corner Radius введите описание изображения здесь

  scrollview.backgroundColor = [UIColor whiteColor]; CALayer *ScrlViewLayer = [scrollview layer]; [ScrlViewLayer setMasksToBounds:NO ]; [ScrlViewLayer setShadowColor:[[UIColor lightGrayColor] CGColor]]; [ScrlViewLayer setShadowOpacity:1.0 ]; [ScrlViewLayer setShadowRadius:6.0 ]; [ScrlViewLayer setShadowOffset:CGSizeMake( 0 , 0 )]; [ScrlViewLayer setShouldRasterize:YES]; [ScrlViewLayer setCornerRadius:5.0]; [ScrlViewLayer setBorderColor:[UIColor lightGrayColor].CGColor]; [ScrlViewLayer setBorderWidth:1.0]; [ScrlViewLayer setShadowPath:[UIBezierPath bezierPathWithRect:scrollview.bounds].CGPath]; 

Решение Swift 3 & IBInspectable:
Вдохновленный решением Аде

Сначала создайте расширение UIView:

 // // UIView-Extension.swift // import Foundation import UIKit @IBDesignable extension UIView { // Shadow @IBInspectable var shadow: Bool { get { return layer.shadowOpacity > 0.0 } set { if newValue == true { self.addShadow() } } } fileprivate func addShadow(shadowColor: CGColor = UIColor.black.cgColor, shadowOffset: CGSize = CGSize(width: 3.0, height: 3.0), shadowOpacity: Float = 0.35, shadowRadius: CGFloat = 5.0) { let layer = self.layer layer.masksToBounds = false layer.shadowColor = shadowColor layer.shadowOffset = shadowOffset layer.shadowRadius = shadowRadius layer.shadowOpacity = shadowOpacity layer.shadowPath = UIBezierPath(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath let backgroundColor = self.backgroundColor?.cgColor self.backgroundColor = nil layer.backgroundColor = backgroundColor } // Corner radius @IBInspectable var circle: Bool { get { return layer.cornerRadius == self.bounds.width*0.5 } set { if newValue == true { self.cornerRadius = self.bounds.width*0.5 } } } @IBInspectable var cornerRadius: CGFloat { get { return self.layer.cornerRadius } set { self.layer.cornerRadius = newValue } } // Borders // Border width @IBInspectable public var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } // Border color @IBInspectable public var borderColor: UIColor? { set { layer.borderColor = newValue?.cgColor } get { if let borderColor = layer.borderColor { return UIColor(cgColor: borderColor) } return nil } } } 

Затем просто выберите свой UIView в настройщике интерфейса настройки теней ON и радиусе угла , как показано ниже:

Выбор вашего UIView

Установка тени и угла поворота

Результат!

результат

Хорошо, если вы не хотите менять свои перья и просматривать иерархию, как предложил Дэвид С., этот метод сделает это за вас. Чтобы добавить закругленные углы и тени к вашему UIImageView, просто используйте этот метод, например:

 [Utils roundCornersForImageView:myImageView withCornerRadius:6.0 andShadowOffset:2.0]; 

(!) По соображениям производительности я не думаю, что неплохо использовать этот код в чем-то вроде UITableView, так как этот код меняет иерархию представлений. Поэтому я предлагаю изменить ваш наконечник и добавить представление контейнера для эффекта тени и использовать код Davic C..

 + (void)roundCornersForImageView:(UIImageView *)imageView withCornerRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset { const float CORNER_RADIUS = cornerRadius; const float BORDER_WIDTH = 1.0; const float SHADOW_OFFSET = shadowOffset; const float SHADOW_OPACITY = 0.8; const float SHADOW_RADIUS = 3.0; //Our old image now is just background image view with shadow UIImageView *backgroundImageView = imageView; UIView *superView = backgroundImageView.superview; //Make wider actual visible rect taking into account shadow //offset CGRect oldBackgroundFrame = backgroundImageView.frame; CGRect newBackgroundFrame = CGRectMake(oldBackgroundFrame.origin.x, oldBackgroundFrame.origin.y, oldBackgroundFrame.size.width + SHADOW_OFFSET, oldBackgroundFrame.size.height + SHADOW_OFFSET); [backgroundImageView removeFromSuperview]; backgroundImageView.frame = newBackgroundFrame; //Make new UIImageView with rounded corners and put our old image CGRect frameForRoundedImageView = CGRectMake(0, 0, oldBackgroundFrame.size.width, oldBackgroundFrame.size.height); UIImageView *roundedImageView = [[UIImageView alloc]initWithFrame:frameForRoundedImageView]; roundedImageView.image = imageView.image; [roundedImageView.layer setCornerRadius:CORNER_RADIUS]; [roundedImageView.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [roundedImageView.layer setBorderWidth:BORDER_WIDTH]; [roundedImageView.layer setMasksToBounds:YES]; //Set shadow preferences [backgroundImageView setImage:nil]; [backgroundImageView.layer setShadowColor:[UIColor blackColor].CGColor]; [backgroundImageView.layer setShadowOpacity:SHADOW_OPACITY]; [backgroundImageView.layer setShadowRadius:SHADOW_RADIUS]; [backgroundImageView.layer setShadowOffset:CGSizeMake(SHADOW_OFFSET, SHADOW_OFFSET)]; //Add out two image views back to the view hierarchy. [backgroundImageView addSubview:roundedImageView]; [superView addSubview:backgroundImageView]; } 

Старая нить все еще актуальна …

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

 + (UIView*)putView:(UIView*)view insideShadowWithColor:(CGColorRef)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { // Must have same position like "view" UIView *shadow = [[UIView alloc] initWithFrame:view.frame]; shadow.layer.contentsScale = [UIScreen mainScreen].scale; shadow.userInteractionEnabled = YES; // Modify this if needed shadow.layer.shadowColor = color; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; shadow.layer.rasterizationScale = [UIScreen mainScreen].scale; shadow.layer.shouldRasterize = YES; [view.superview insertSubview:shadow belowSubview:view]; [shadow addSubview:view]; // Move view to the top left corner inside the shadowview // ---> Buttons etc are working again :) view.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height); return shadow; } 

Вот решение для проблемы с конфликтами masksToBounds, оно работает для меня.

После того, как вы установили corderRadius / borderColor / shadow и т. Д., Установите masksToBounds как NO:

 v.layer.masksToBounds = NO; 

Следующее работало лучше для меня (этот код лежит в расширении UIView, поэтому self обозначает некоторый UIView, к которому мы должны добавить тень и круглый угол)

 - (void)addShadowViewWithCornerRadius:(CGFloat)radius { UIView *container = self.superview; if (!container) { return; } UIView *shadowView = [[UIView alloc] init]; shadowView.translatesAutoresizingMaskIntoConstraints = NO; shadowView.backgroundColor = [UIColor lightGrayColor]; shadowView.layer.cornerRadius = radius; shadowView.layer.masksToBounds = YES; [container addSubview:shadowView]; [container bringSubviewToFront:shadowView]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:2.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:2.0]]; [container sendSubviewToBack:shadowView]; } 

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

Ответ daniel.gindi выше сделал трюк для меня! (+1 daniel) Тем не менее, мне пришлось внести небольшие корректировки – измените размер shadowFrame таким же, как размер кадра в представлении, и включите взаимодействие с пользователем. Вот обновленный код:

 + (UIView*)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame; // Modify this if needed // Modified this line shadowFrame.size = CGSizeMake(view.frame.size.width, view.frame.size.height); shadowFrame.origin.x = 0.f; shadowFrame.origin.y = 0.f; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; // Modified this line shadow.userInteractionEnabled = YES; shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [shadow addSubview:view]; return shadow; } 

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

 UIView *shadow = [self putView:vc.view insideShadowWithColor:[UIColor blackColor] andRadius:5.0 andOffset:CGSizeMake(0.0, 0.0) andOpacity:1.0]; vc.view = shadow; vc.view.layer.cornerRadius = 5.0; vc.view.layer.masksToBounds = YES; 

Я вношу некоторые изменения в код daniel.gindi

Это все, что вам нужно, чтобы заставить его работать.

 + (void)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andBlur: (CGFloat)blur andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame = view.frame; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; shadow.backgroundColor = [UIColor redColor]; shadow.userInteractionEnabled = YES; // Modify this if needed shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = blur; shadow.layer.cornerRadius = view.layer.cornerRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [view.superview insertSubview:shadow belowSubview:view]; } 

Вот моя версия в Swift 3 для UIView

 let corners:UIRectCorner = [.bottomLeft, .topRight] let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath mask.fillColor = UIColor.white.cgColor let shadowLayer = CAShapeLayer() shadowLayer.shadowColor = UIColor.black.cgColor shadowLayer.shadowOffset = CGSize(width: 0.0, height: 4.0) shadowLayer.shadowRadius = 6.0 shadowLayer.shadowOpacity = 0.25 shadowLayer.shadowPath = mask.path self.layer.insertSublayer(shadowLayer, at: 0) self.layer.insertSublayer(mask, at: 1) 

Я пробовал так много решений с этой должности и в итоге получил решение ниже. Это полнофункциональное решение, если вам не нужно отбрасывать тень на четком цветовом представлении .

 - (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; } 

Ответ, предоставленный Эваном Мулавским, будет работать отлично. Уловка заключается в том, что вам нужно установить цвет фона для вида clearColor и свойство masksToBounds на NO.

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

 v.layer.backgroundColor = your color; 

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

Для этого вам нужно использовать два UIViews . Один UIView будет работать как тень, а другой – для округленной границы.

Ниже приведен фрагмент кода Class Method с помощью protocol :

 @implementation UIMethods + (UIView *)genComposeButton:(UIViewController <UIComposeButtonDelegate> *)observer; { UIView *shadow = [[UIView alloc]init]; shadow.layer.cornerRadius = 5.0; shadow.layer.shadowColor = [[UIColor blackColor] CGColor]; shadow.layer.shadowOpacity = 1.0; shadow.layer.shadowRadius = 10.0; shadow.layer.shadowOffset = CGSizeMake(0.0f, -0.5f); UIButton *btnCompose = [[UIButton alloc]initWithFrame:CGRectMake(0, 0,60, 60)]; [btnCompose setUserInteractionEnabled:YES]; btnCompose.layer.cornerRadius = 30; btnCompose.layer.masksToBounds = YES; [btnCompose setImage:[UIImage imageNamed:@"60x60"] forState:UIControlStateNormal]; [btnCompose addTarget:observer action:@selector(btnCompose_click:) forControlEvents:UIControlEventTouchUpInside]; [shadow addSubview:btnCompose]; return shadow; } 

In the code above btnCompose_click: will become a @required delegate method which will fire on the button click.

And here I added a button to my UIViewController like this:

 UIView *btnCompose = [UIMethods genComposeButton:self]; btnCompose.frame = CGRectMake(self.view.frame.size.width - 75, self.view.frame.size.height - 75, 60, 60); [self.view addSubview:btnCompose]; 

Результат будет выглядеть так:

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

This is how you do it, with rounded corners and rounded shadows without bothering with paths.

 //Inner view with content [imageView.layer setBorderColor:[[UIColor lightGrayColor] CGColor]]; [imageView.layer setBorderWidth:1.0f]; [imageView.layer setCornerRadius:8.0f]; [imageView.layer setMasksToBounds:YES]; //Outer view with shadow UIView* shadowContainer = [[UIView alloc] initWithFrame:imageView.frame]; [shadowContainer.layer setMasksToBounds:NO]; [shadowContainer.layer setShadowColor:[[UIColor blackColor] CGColor]]; [shadowContainer.layer setShadowOpacity:0.6f]; [shadowContainer.layer setShadowRadius:2.0f]; [shadowContainer.layer setShadowOffset: CGSizeMake(0.0f, 2.0f)]; [shadowContainer addSubview:imageView]; 

The view with content, in my case a UIImageView, has a corner radius and therefore has to mask to bounds.

We create another equally sized view for the shadows, set it's maskToBounds to NO and then add the content view to the container view (eg shadowContainer).

I write this UIView category method to solve this problem, uses separate views for the shadow and the corner radius.

 -(UIView *)shadowedWrapViewWithBounds:(CGRect)bounds { UIView *baseView = [[UIView alloc] init]; baseView.bounds = bounds; baseView.backgroundColor = [UIColor clearColor]; baseView.layer.shadowColor = [UIColor blackColor].CGColor; baseView.layer.shadowOffset = CGSizeMake(0, 0); baseView.layer.shadowOpacity = 0.7; baseView.layer.shadowRadius = 4.0; // improve performance baseView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:baseView.bounds cornerRadius:4].CGPath; baseView.layer.shouldRasterize = YES; baseView.layer.rasterizationScale = [UIScreen mainScreen].scale; [baseView addSubview:self]; //use Masonry autolayout, self can set corner radius [self makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(baseView); }]; return baseView; } 

You need to use use shadowView and roundView

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

shadowView

  • Must has background color
  • Should lay behind roundView
  • The trick is to layout shadowView a bit inside, and its shadow needs to glow out. Adjust the insets so that shadowView is completely invisible behind roundView

roundView

  • Must clips subviews

Код

 addSubviews(shadowView, roundView) roundView.addSubviews(titleLabel, subtitleLabel, imageView) // need inset shadowView.pinEdges(view: self, inset: UIEdgeInsets(constraintInsets: 2)) roundView.pinEdges(view: self) do { shadowView.backgroundColor = .white // need background let layer = shadowView.layer layer.shadowColor = UIColor.black.cgColor layer.shadowRadius = 3 layer.shadowOffset = CGSize(width: 3, height: 3) layer.shadowOpacity = 0.7 layer.shouldRasterize = true } do { roundView.backgroundColor = .white let layer = roundView.layer layer.masksToBounds = true layer.cornerRadius = 5 } 

You need add masksToBounds = true for combined between corderRadius shadowRadius .

 button.layer.masksToBounds = false; 
  • Можем ли мы передать несколько параметров для перехода UIViewWithView: duration: options: animations: complete: method?
  • iOS - изменение размера вертикальных представлений с видом разделителя
  • ПрикосновениеBegan, touchhesEnded, touchMMoved для перемещения UIView
  • UITableViewRowAnimationNone - ведет себя как UITableViewRowAnimation (сверху / снизу)
  • EAGLView для преобразования цвета UIImage
  • Каковы побочные эффекты вызова
  • Добавление заголовка UIButton в UITableView
  • Как организовать много UIView в шаблоне, ориентированном на дисплеи различного размера
  • Программно показать UIView
  • Автоматическая компоновка UIViewController в коде с использованием языка форматирования
  • Вертикальная флип-анимация UIView
  • Interesting Posts

    Как передать брелок на шаг «Проверить зависимости» xcodebuild

    AWS s3 upload + api слишком долго

    AND и OR в сочетании с NSPredicate. IOS Swift

    Невозможно изменить SKView backgroundColor

    Flurry v 4.2.3 проблемы с связыванием

    Xcode 8.3 автозаполнение и подсветка синтаксиса не работают

    Как кластеризовать маркеры из Firebase в GoogleMaps для iOS

    Отключить WKWebView для открытия ссылок для перенаправления на приложения, установленные на моем iPhone

    Передача данных между ViewController и TabBarController

    css @media, чтобы проверить, является ли это iPhone или Android

    (iOS) Почему AVAudioPlayer initWithContentsOfURL всегда терпит неудачу с кодом ошибки = -43

    Как скрыть панель вкладок с анимацией в iOS?

    Как опубликовать приложение iOS на стене facebook без изменения пользователем сообщения

    Использование completeHandler (UIBackgroundFetchResultNewData) при обновлении фона в iOS

    Запросить пользователей по имени или адресу электронной почты с помощью Firebase (Swift)

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