2010-02-21 91 views
14

我正在寻找方法来逐渐添加渐变或可能模糊边框(我不完全知道如何命名此效果)为任意UIView。我不需要动画效果,我需要静态效果,例如我的UITableView边框部分透明。我所做的例子:UIView边界渐变或模糊效果

enter image description here

所以你可以看到我想要做的事。

任何人都可以帮助我吗?

+0

任何想法?请... – iKiR 2010-02-23 17:21:06

回答

16

我已经找到了解决办法 - 我useed的CALayer的性质掩码:

CALayer *viewLayer = [back layer]; 
CALayer* maskCompoudLayer = [CALayer layer]; 

maskLayer.bounds = viewLayer.bounds; 

[maskLayer setPosition:CGPointMake(160, CGRectGetHeight(maskCompoudLayer.frame)/2.0)];  

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate (NULL, 320, 480, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);  

CGFloat colors[] = { 
     0.5, 0.5, 0.5, 0.0, //BLACK 
     0.0, 0.0, 0.0, 1.0, //BLACK 
};  

CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));  
CGColorSpaceRelease(colorSpace);  

NSUInteger gradientH = 20; 
NSUInteger gradientHPos = 0; 

CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0].CGColor); 
CGContextFillRect(context, CGRectMake(0, gradientHPos + gradientH, CGRectGetWidth(maskLayer.frame), CGRectGetHeight(maskLayer.frame)));  

CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.0].CGColor); 
CGContextFillRect(context, CGRectMake(0, 0, 320, gradientHPos)); 

CGContextDrawLinearGradient(context, gradient, CGPointMake(160, gradientHPos), CGPointMake(160, gradientHPos + gradientH), 0);  
CGGradientRelease(gradient);  

CGImageRef contextImage = CGBitmapContextCreateImage(context); 
CGContextRelease(context);  

[maskLayer setContents:(id)contextImage]; 

CGImageRelease (contextImage); 

viewLayer.masksToBounds = YES; 
viewLayer.mask = maskCompoudLayer; 

使用此代码我的UITableView与衰落边境

+0

请您详细说明这是如何与UITableView实际结合的?谢谢! – jowie 2010-08-25 23:00:33

+7

我也想知道你是如何特意使用它的。你能否发布一个更完整的代码块?什么是maskLayer?什么是背层? – DoctorG 2011-04-03 13:36:24

+6

你好,2011年的人。我从2012年开始,仍然想知道细节。所以,我想我会在我想出的东西上添加一个答案。 – Mazyod 2012-07-12 12:43:39

3

您可以尝试在UITableView的底部放置一个半透明的PNG文件。

+3

是的,但在这种情况下,我将不得不为不同的背景使用不同的PNG,我想找到一个通用的解决方案 – iKiR 2010-02-24 19:08:04

10

我会说这个第一,iKiR的回答是更对我来说足够了。我将代码照原样复制,并且从我身边几乎没有经验,我可以毫不费力地工作(在UITableView上)。

  1. 创建一个新的UIView子类,我会打电话给它MaskingView
  2. 进口QuartzCore框架!
  3. 将下面的代码粘贴到init中。 (initWithCoder:和/或initWithFrame:
  4. 添加要在MaskingView内应用不透明羽化的视图。 (在界面生成器中,用户编辑器 - >嵌入 - >视图然后,选择新的超级视图的级别为MaskingView
  5. 给予iKiR的所有功劳,因为我很不知道代码是如何工作的,确实有用!

注:

  • 我开发一个通用的应用程序,和下面的代码工作,因为它是在两个设备上! (iPhone/iPad)
  • 当使用Embed In - > UIView时,新视图会比子视图大一点。你必须使它完全符合子视图。但是,在调整大小之前,请确保取消选中autoresize子视图。

验证码:

CALayer *viewLayer = [self layer]; 
CALayer* maskLayer = [CALayer layer]; 

maskLayer.bounds = viewLayer.bounds; 

[maskLayer setPosition:CGPointMake(CGRectGetWidth(viewLayer.frame)/2.0, CGRectGetHeight(viewLayer.frame)/2.0)];  

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate (NULL, viewLayer.bounds.size.width, viewLayer.bounds.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);  

CGFloat colors[] = { 
    0.5, 0.5, 0.5, 0.0, //BLACK 
    0.0, 0.0, 0.0, 1.0, //BLACK 
};  

CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));  
CGColorSpaceRelease(colorSpace);  

NSUInteger gradientH = 20; 
NSUInteger gradientHPos = 0; 

CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0].CGColor); 
CGContextFillRect(context, CGRectMake(0, gradientHPos + gradientH, CGRectGetWidth(maskLayer.frame), CGRectGetHeight(maskLayer.frame)));  

CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.0].CGColor); 
CGContextFillRect(context, CGRectMake(0, 0, 320, gradientHPos)); 

CGContextDrawLinearGradient(context, gradient, CGPointMake(160, gradientHPos), CGPointMake(160, gradientHPos + gradientH), 0);  
CGGradientRelease(gradient);  

CGImageRef contextImage = CGBitmapContextCreateImage(context); 
CGContextRelease(context);  

[maskLayer setContents:(__bridge id)contextImage]; 

CGImageRelease (contextImage); 

viewLayer.masksToBounds = YES; 
viewLayer.mask = maskLayer; 
3

有在Cocoanetics一个教程,做的是千真万确的事情。

+0

这只适用于如果您使用静态彩色背景,不适用于图像背景,因为本教程在要“淡出”视图顶部添加彩色渐变, – Hjalmar 2014-01-21 09:49:12

1

这里是iKiR和Mazyod的答案,翻译成Xamarin.iOS(Monotouch)。请注意,如果您只是将正确的标志传递给DrawLinearGradient方法,则无需在渐变之前和之后绘制矩形:

var vl = myView.Layer; 
var l = new CALayer(); 
l.Frame = new RectangleF(vl.Frame.Width/2, vl.Frame.Height/2, 
      vl.Frame.Width, vl.Frame.Height) ; 
var cs = CGColorSpace.CreateDeviceRGB(); 
var g = new CGBitmapContext (null, 
      (int) vl.Bounds.Size.Width, (int)vl.Bounds.Size.Height, 
      8, 0, cs, CGImageAlphaInfo.PremultipliedLast); 
var colors = new CGColor[] { UIColor.FromWhiteAlpha(1, 0).CGColor, 
      UIColor.FromWhiteAlpha(1, 1f).CGColor }; 
var grad = new CGGradient (cs, colors, new float[] { 0f, 1f }); 
int gradH = 20, gradHPos = 0; 
g.DrawLinearGradient (grad, 
      new PointF (l.Frame.Width/2, gradHPos), new PointF (l.Frame.Width/2, gradHPos + gradH), 
      CGGradientDrawingOptions.DrawsBeforeStartLocation | CGGradientDrawingOptions.DrawsAfterEndLocation); 
grad.Dispose(); 

l.Contents = g.ToImage(); 
g.Dispose(); 

vl.Mask = l; 
vl.MasksToBounds = true;