Создание размытого вида наложения
в музыкальном приложении новой iOS мы можем увидеть обложку альбома за видом, который размывает его.
Как можно сделать что-то подобное? Я читал документацию, но ничего там не нашел.
20 ответов:
можно использовать
UIVisualEffectView
для достижения этого эффекта. Это родной API, который был точно настроен для производительности и большой срок службы батареи, плюс это легко реализовать.Swift:
//only apply the blur if the user hasn't disabled transparency effects if !UIAccessibilityIsReduceTransparencyEnabled() { view.backgroundColor = .clear let blurEffect = UIBlurEffect(style: .dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) //always fill the view blurEffectView.frame = self.view.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed } else { view.backgroundColor = .black }
Цель-C:
//only apply the blur if the user hasn't disabled transparency effects if (!UIAccessibilityIsReduceTransparencyEnabled()) { self.view.backgroundColor = [UIColor clearColor]; UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; //always fill the view blurEffectView.frame = self.view.bounds; blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:blurEffectView]; //if you have more UIViews, use an insertSubview API to place it where needed } else { self.view.backgroundColor = [UIColor blackColor]; }
Если вы представляете этот контроллер вида модально, чтобы размыть основное содержимое, вам нужно будет установить модальный стиль представления в течение текущего контекста и установить цвет фона для очистки, чтобы обеспечить базовый контроллер Вида останется видимым, как только он будет представлен сверху.
Core Image
так как это изображение на скриншоте является статическим, вы можете использовать
CIGaussianBlur
из основного образа (требуется iOS 6). Вот пример: https://github.com/evanwdavis/Fun-with-Masks/blob/master/Fun%20with%20Masks/EWDBlurExampleVC.mимейте в виду, что это медленнее, чем другие параметры на этой странице.
#import <QuartzCore/QuartzCore.h> - (UIImage*) blur:(UIImage*)theImage { // ***********If you need re-orienting (e.g. trying to blur a photo taken from the device camera front facing camera in portrait mode) // theImage = [self reOrientIfNeeded:theImage]; // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; // setting up Gaussian Blur (we could use one of many filters offered by Core Image) CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"]; [filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:[NSNumber numberWithFloat:15.0f] forKey:@"inputRadius"]; CIImage *result = [filter valueForKey:kCIOutputImageKey]; // CIGaussianBlur has a tendency to shrink the image a little, // this ensures it matches up exactly to the bounds of our original image CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]]; UIImage *returnImage = [UIImage imageWithCGImage:cgImage];//create a UIImage for this function to "return" so that ARC can manage the memory of the blur... ARC can't manage CGImageRefs so we need to release it before this function "returns" and ends. CGImageRelease(cgImage);//release CGImageRef because ARC doesn't manage this on its own. return returnImage; // *************** if you need scaling // return [[self class] scaleIfNeeded:cgImage]; } +(UIImage*) scaleIfNeeded:(CGImageRef)cgimg { bool isRetina = [[[UIDevice currentDevice] systemVersion] intValue] >= 4 && [[UIScreen mainScreen] scale] == 2.0; if (isRetina) { return [UIImage imageWithCGImage:cgimg scale:2.0 orientation:UIImageOrientationUp]; } else { return [UIImage imageWithCGImage:cgimg]; } } - (UIImage*) reOrientIfNeeded:(UIImage*)theImage{ if (theImage.imageOrientation != UIImageOrientationUp) { CGAffineTransform reOrient = CGAffineTransformIdentity; switch (theImage.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, theImage.size.height); reOrient = CGAffineTransformRotate(reOrient, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0); reOrient = CGAffineTransformRotate(reOrient, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: reOrient = CGAffineTransformTranslate(reOrient, 0, theImage.size.height); reOrient = CGAffineTransformRotate(reOrient, -M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (theImage.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0); reOrient = CGAffineTransformScale(reOrient, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: reOrient = CGAffineTransformTranslate(reOrient, theImage.size.height, 0); reOrient = CGAffineTransformScale(reOrient, -1, 1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } CGContextRef myContext = CGBitmapContextCreate(NULL, theImage.size.width, theImage.size.height, CGImageGetBitsPerComponent(theImage.CGImage), 0, CGImageGetColorSpace(theImage.CGImage), CGImageGetBitmapInfo(theImage.CGImage)); CGContextConcatCTM(myContext, reOrient); switch (theImage.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.height,theImage.size.width), theImage.CGImage); break; default: CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.width,theImage.size.height), theImage.CGImage); break; } CGImageRef CGImg = CGBitmapContextCreateImage(myContext); theImage = [UIImage imageWithCGImage:CGImg]; CGImageRelease(CGImg); CGContextRelease(myContext); } return theImage; }
размытие стека (Box + Gaussian)
- StackBlur это реализует сочетание коробки и Гауссово размывание. 7x быстрее, чем не ускоренный гауссовский, но не такой уродливый, как размытие коробки. Смотрите демо в здесь (версия плагина Java) или здесь (JavaScript-версия). Этот алгоритм используется в KDE и Camera+ и других. Он не использует структуру ускорения, но это быстро.
Ускорить Рамки
в сеансе "реализация привлекательного пользовательского интерфейса на iOS" от WWDC 2013 Apple объясняет, как создать размытый фон (в 14:30), и упоминает метод
applyLightEffect
реализовано в примере кода с помощью ускорения.рамки.GPUImage использует шейдеры OpenGL для создания динамических размытий. Он имеет несколько типов размытия: GPUImageBoxBlurFilter, GPUImageFastBlurFilter, GaussianSelectiveBlur, GPUImageGaussianBlurFilter. Существует даже GPUImageiOSBlurFilter, который " должен полностью копировать эффект размытия, предоставляемый панелью управления iOS 7" (Твитнуть,статьи). Статья является подробной и информативной.
-(UIImage *)blurryGPUImage:(UIImage *)image withBlurLevel:(NSInteger)blur { GPUImageFastBlurFilter *blurFilter = [GPUImageFastBlurFilter new]; blurFilter.blurSize = blur; UIImage *result = [blurFilter imageByFilteringImage:image]; return result; }
от indieambitions.com: выполните размытие с помощью vImage. Алгоритм также используется в iOS-RealTimeBlur.
от Ника Локвуда:https://github.com/nicklockwood/FXBlurView в примере показано размытие над видом прокрутки. Он размывается с помощью dispatch_async, а затем синхронизируется с вызовите обновления с помощью UITrackingRunLoopMode, чтобы размытие не отставало, когда UIKit дает больше приоритета прокрутке UIScrollView. Это объясняется в книге Ника iOS Core Animation, который, кстати, здорово.
прошивкой подавления размытости это берет размытый слой UIToolbar и помещает его в другое место. Apple отклонит ваше приложение, если вы используете этот метод. Видеть https://github.com/mochidev/MDBlurView/issues/4
из блога Evadne:LiveFrost: Быстрая, Синхронная Свертка Снимка UIView. Отличный код и отличное чтение. Некоторые идеи из этого поста:
- используйте последовательную очередь для дросселирования обновлений из CADisplayLink.
- повторно использовать растровые контексты, если границы не изменятся.
- нарисуйте меньшие изображения с помощью - [CALayer renderInContext:] с масштабом 0,5 f факторный.
прочее
Энди Matuschak сказал в Твиттере: "вы знаете, многие места, где кажется, что мы делаем это в реальном времени, это статично с умными трюками."
At doubleencore.com они говорят:"мы обнаружили, что радиус размытия 10 пт плюс увеличение насыщенности на 10 пт лучше всего имитирует эффект размытия iOS 7 в большинстве случаев".
заглянуть в частные заголовки Яблоко SBFProceduralWallpaperView.
наконец, это не настоящее размытие, но помните, что вы можете установить rasterizationScale, чтобы получить пиксельное изображение:http://www.dimzzy.com/blog/2010/11/blur-effect-for-uiview/
Я решил опубликовать письменную версию Objective-C из принятого ответа, чтобы предоставить больше возможностей в этом вопросе..
- (UIView *)applyBlurToView:(UIView *)view withEffectStyle:(UIBlurEffectStyle)style andConstraints:(BOOL)addConstraints { //only apply the blur if the user hasn't disabled transparency effects if(!UIAccessibilityIsReduceTransparencyEnabled()) { UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:style]; UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; blurEffectView.frame = view.bounds; [view addSubview:blurEffectView]; if(addConstraints) { //add auto layout constraints so that the blur fills the screen upon rotating device [blurEffectView setTranslatesAutoresizingMaskIntoConstraints:NO]; [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]]; [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeading multiplier:1 constant:0]]; [view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]]; } } else { view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.7]; } return view; }
ограничения могут быть удалены, если вы хотите упаковать, если вы поддерживаете только портретный режим, или я просто добавляю флаг в эту функцию, чтобы использовать их или нет..
Я не думаю, что мне разрешено публиковать код, но приведенный выше пост, в котором упоминается пример кода WWDC, является правильным. Вот ссылка:https://developer.apple.com/downloads/index.action?name=WWDC%202013
файл, который вы ищете, является категорией на UIImage, и метод applyLightEffect.
Как я уже отмечал выше в комментарии, Apple Blur имеет насыщенность и другие вещи, происходящие помимо размытия. Простое размытие не подойдет... если вы не хотите подражать их стилю.
я думаю, что самое простое решение для этого-переопределить UIToolbar, который размывает все за ним в iOS 7. Это довольно подлый, но это очень просто для вас, чтобы реализовать, и быстро!
вы можете сделать это с любым видом, просто сделайте его подклассом
UIToolbar
вместоUIView
. Вы даже можете сделать это с помощьюUIViewController
' sview
свойства, например...1) создайте новый класс, который является "подклассом"
UIViewController
и установите флажок " с XIB для пользователя взаимодействие."2) выберите вид и перейдите к инспектору идентификации в правой панели (alt-command-3). Измените "класс" на
UIToolbar
. Теперь перейдите в Инспектор атрибутов (alt-command-4) и измените цвет "фона" на "очистить цвет".3) Добавьте подвид в основной вид и подключите его к IBOutlet в вашем интерфейсе. Назовите это
backgroundColorView
. Это будет выглядеть примерно так, как отдельная категория в реализации (.m
) файл.@interface BlurExampleViewController () @property (weak, nonatomic) IBOutlet UIView *backgroundColorView; @end
4) перейдите к реализации контроллера вида (
.m
) файл и изменить-viewDidLoad
метод, чтобы выглядеть следующим образом:- (void)viewDidLoad { [super viewDidLoad]; self.view.barStyle = UIBarStyleBlack; // this will give a black blur as in the original post self.backgroundColorView.opaque = NO; self.backgroundColorView.alpha = 0.5; self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1]; }
это даст вам темно-серый вид, который размывает все позади него. Нет смешного бизнеса, нет медленного размытия изображения ядра, используя все, что у вас под рукой предусмотрено OS/SDK.
вы можете добавить представление этого контроллера вида в другое представление следующим образом:
[self addChildViewController:self.blurViewController]; [self.view addSubview:self.blurViewController.view]; [self.blurViewController didMoveToParentViewController:self]; // animate the self.blurViewController into view
Дайте мне знать, если ничего непонятно, буду рад помочь!
Edit
UIToolbar был изменен в 7.0.3, чтобы дать возможно-нежелательный эффект при использовании цветное пятно.
раньше мы могли установить цвет с помощью
barTintColor
, но если вы делали это раньше, вам нужно будет установить Альфа-компонент меньше 1. В противном случае ваш UIToolbar будет полностью непрозрачным цветом - без размытия.это может быть достигнуто следующим образом: (подшипник в виду
self
является наследникомUIToolbar
)UIColor *color = [UIColor blueColor]; // for example self.barTintColor = [color colorWithAlphaComponent:0.5];
это придаст синеватый оттенок размытому виду.
вот быстрая реализация в Swift с использованием CIGaussianBlur:
func blur(image image: UIImage) -> UIImage { let radius: CGFloat = 20; let context = CIContext(options: nil); let inputImage = CIImage(CGImage: image.CGImage!); let filter = CIFilter(name: "CIGaussianBlur"); filter?.setValue(inputImage, forKey: kCIInputImageKey); filter?.setValue("\(radius)", forKey:kCIInputRadiusKey); let result = filter?.valueForKey(kCIOutputImageKey) as! CIImage; let rect = CGRectMake(radius * 2, radius * 2, image.size.width - radius * 4, image.size.height - radius * 4) let cgImage = context.createCGImage(result, fromRect: rect); let returnImage = UIImage(CGImage: cgImage); return returnImage; }
принятый ответ правильный, но здесь отсутствует важный шаг, если этот вид, для которого вы хотите размытый фон, представлен с помощью
[self presentViewController:vc animated:YES completion:nil]
по умолчанию это отменит размытие, поскольку UIKit удаляет представление докладчика, которое вы фактически размываете. Чтобы избежать этого удаления, добавьте эту строку перед предыдущей
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
или использовать другие
Over
стили.
С
UIVisualEffect *blurEffect; blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *visualEffectView; visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; visualEffectView.frame = self.accessImageView.bounds; [self.accessImageView addSubview:visualEffectView];
SWIFT 3.0
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = view.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(blurEffectView)
нашел это случайно, дает мне действительно отличные (почти дублирующие с Apple) результаты и использует структуру ускорения. -- http://pastebin.com/6cs6hsyQ *Не написано мной
func blurBackgroundUsingImage(image: UIImage) { var frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) var imageView = UIImageView(frame: frame) imageView.image = image imageView.contentMode = .ScaleAspectFill var blurEffect = UIBlurEffect(style: .Light) var blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = frame var transparentWhiteView = UIView(frame: frame) transparentWhiteView.backgroundColor = UIColor(white: 1.0, alpha: 0.30) var viewsArray = [imageView, blurEffectView, transparentWhiteView] for index in 0..<viewsArray.count { if let oldView = self.view.viewWithTag(index + 1) { var oldView = self.view.viewWithTag(index + 1) // Must explicitly unwrap oldView to access its removeFromSuperview() method as of Xcode 6 Beta 5 oldView!.removeFromSuperview() } var viewToInsert = viewsArray[index] self.view.insertSubview(viewToInsert, atIndex: index + 1) viewToInsert.tag = index + 1 } }
Apple предоставила расширение для класса UIImage под названием UIImage+ImageEffects.h. в этом классе у вас есть необходимые методы для размытия вашего представления
Использование UIImageEffects
для людей, которые хотят больше контроля, вы можете использовать Apple
UIImageEffects
пример кода.вы можете скопировать код
UIImageEffects
из библиотеки разработчиков Apple:размытие и тонирование изображенияи вот как его применить:
#import "UIImageEffects.h" ... self.originalImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];
этот ответ основан на отличный ранний ответ Мити Семолика. Я преобразовал его в swift 3, добавил объяснение тому, что происходит в coments, сделал его расширением UIViewController, чтобы любой VC мог вызвать его по своему желанию, добавил незамутненное представление для отображения выборочного приложения и добавил блок завершения, чтобы вызывающий контроллер представления мог делать все, что он хочет, по завершении размытия.
import UIKit //This extension implements a blur to the entire screen, puts up a HUD and then waits and dismisses the view. extension UIViewController { func blurAndShowHUD(duration: Double, message: String, completion: @escaping () -> Void) { //with completion block //1. Create the blur effect & the view it will occupy let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light) let blurEffectView = UIVisualEffectView()//(effect: blurEffect) blurEffectView.frame = self.view.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] //2. Add the effect view to the main view self.view.addSubview(blurEffectView) //3. Create the hud and add it to the main view let hud = HudView.getHUD(view: self.view, withMessage: message) self.view.addSubview(hud) //4. Begin applying the blur effect to the effect view UIView.animate(withDuration: 0.01, animations: { blurEffectView.effect = blurEffect }) //5. Halt the blur effects application to achieve the desired blur radius self.view.pauseAnimationsInThisView(delay: 0.004) //6. Remove the view (& the HUD) after the completion of the duration DispatchQueue.main.asyncAfter(deadline: .now() + duration) { blurEffectView.removeFromSuperview() hud.removeFromSuperview() self.view.resumeAnimationsInThisView() completion() } } } extension UIView { public func pauseAnimationsInThisView(delay: Double) { let time = delay + CFAbsoluteTimeGetCurrent() let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, time, 0, 0, 0, { timer in let layer = self.layer let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil) layer.speed = 0.0 layer.timeOffset = pausedTime }) CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.commonModes) } public func resumeAnimationsInThisView() { let pausedTime = layer.timeOffset layer.speed = 1.0 layer.timeOffset = 0.0 layer.beginTime = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime } }
Я подтвердил, что он работает с iOS 10.3.1 и iOS 11
важное дополнение к ответу @Joey
Это относится к ситуации, когда вы хотите представить размытый фон
UIViewController
СUINavigationController
.// suppose you've done blur effect with your presented view controller UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController]; // this is very important, if you don't do this, the blur effect will darken after view did appeared // the reason is that you actually present navigation controller, not presented controller // please note it's "OverFullScreen", not "OverCurrentContext" nav.modalPresentationStyle = UIModalPresentationOverFullScreen; UIViewController *presentedViewController = [[UIViewController alloc] init]; // the presented view controller's modalPresentationStyle is "OverCurrentContext" presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; [presentingViewController presentViewController:nav animated:YES completion:nil];
наслаждайтесь!
вот код Swift 2.0 для решения, которое было предоставлено в принято отвечать:
//only apply the blur if the user hasn't disabled transparency effects if !UIAccessibilityIsReduceTransparencyEnabled() { self.view.backgroundColor = UIColor.clearColor() let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) //always fill the view blurEffectView.frame = self.view.bounds blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] self.view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed } else { self.view.backgroundColor = UIColor.blackColor() }
если добавить темное размытие для tableView, это будет красиво сделать это:
tableView.backgroundColor = .clear let blurEffect = UIBlurEffect(style: .dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = tableView.bounds blurEffectView.autoresizingMask = [.flexibleHeight, .flexibleWidth] // Assigning blurEffectView to backgroundView instead of addSubview to tableView makes tableView cell not blocked by blurEffectView tableView.backgroundView = blurEffectView
пользовательский масштаб размытия
вы можете попробовать
UIVisualEffectView
С настройки как -class BlurViewController: UIViewController { private let blurEffect = (NSClassFromString("_UICustomBlurEffect") as! UIBlurEffect.Type).init() override func viewDidLoad() { super.viewDidLoad() let blurView = UIVisualEffectView(frame: UIScreen.main.bounds) blurEffect.setValue(1, forKeyPath: "blurRadius") blurView.effect = blurEffect view.addSubview(blurView) } }
выход:- для
blurEffect.setValue(1...
&blurEffect.setValue(2..
Swift 4:
чтобы добавить наложение или всплывающее представление, вы также можете использовать представление контейнера, с которым вы получаете бесплатный контроллер вида ( вы получаете представление контейнера из обычной палитры/библиотеки объектов)
действия:
есть вид (ViewForContainer на рис.), который содержит этот вид контейнера, чтобы затемнить его при отображении содержимого вида контейнера. Подключите розетку внутри первого контроллера вида
скрыть это представление, когда 1-й VC нагрузки
отобразить при нажатии кнопки Введите описание изображения здесь
чтобы затемнить это представление при отображении содержимого представления контейнера, установите фон представления на черный и непрозрачность 30%
Я добавил ответ на создание представления popview в другом вопросе Stackoverflow https://stackoverflow.com/a/49729431/5438240
простой ответ-добавить подвид и изменить его альфа.
UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; UIView *subView = [[UIView alloc] initWithFrame:popupView.frame]; UIColor * backImgColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blue_Img.png"]]; subView.backgroundColor = backImgColor; subView.alpha = 0.5; [mainView addSubview:subView];