2010-02-21 16 views
14

Ich suche nach Methode allmählich hinzuzufügen Verblassen oder vielleicht blured Grenze (ich weiß nicht genau, wie diese Wirkung zu nennen) auf beliebige UIView. Ich brauche keinen animierten Effekt, ich brauche einen statischen Effekt, zum Beispiel ist mein UITableView-Rahmen teilweise transparent. Ich habe das Beispiel gemacht:UIView Grenze zu verblassen oder Unschärfe-Effekt

enter image description here

So können Sie sehen, was ich versuche zu tun.

Kann mir jemand helfen?

+0

Irgendwelche Ideen? Bitte... – iKiR

Antwort

16

Ich habe eine Lösung gefunden - ich habe CALayer Eigentum Maske useed:

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; 

Mit diesem Code Ich habe UITableView mit Fading Grenze

+0

Könnten Sie bitte erläutern, wie dies tatsächlich mit dem UITableView kombiniert wurde? Vielen Dank! – jowie

+7

Ich würde auch gerne wissen, wie Sie das speziell genutzt haben. Könnten Sie bitte einen vollständigeren Codeblock posten? Was ist Maskenschicht? Was ist Rückschicht? – DoctorG

+6

Hallo Leute, Leute von 2011. Ich bin hier seit 2012, und will immer noch die Details wissen. Also, ich schätze, ich werde eine Antwort hinzufügen, auf was ich gekommen bin. – Mazyod

3

Sie könnten versuchen, eine halbtransparente PNG-Datei über den Boden des UITableView platzieren.

+3

Ja, aber in diesem Fall muss ich verschiedene PNGs für verschiedene Hintergründe haben, würde ich gerne eine universelle Lösung finden – iKiR

10

Ich werde sagen, dass diese erste, iKiR Antwort mehr war als genug für mich. Ich kopierte den Code, wie es ist, und mit wenig Erfahrung von meiner Seite, ich konnte es mühelos funktioniert (auf UITableView). Erstellen

  1. eine neue UIView Unterklasse, ich nenne es MaskingView
  2. Import QuartzCore Rahmen!
  3. Fügen Sie den Code unten in der init. (initWithCoder: und/oder initWithFrame: entsprechend)
  4. Fügen Sie die Ansicht hinzu, dass Sie die Opazität Feathering innerhalb der MaskingView anwenden möchten. (In Interface Builder, Benutzer-Editor -> Einbetten in -> Ansicht. Dann wählen Sie die Klasse der neuen Superview als)
  5. Geben Sie alle Kredit an iKiR, denn ich habe keine Ahnung, wie der Code funktioniert, aber es einfach funktioniert!

NOTES:

  • Ich bin ein Universal-App zu entwickeln, und der folgende Code funktioniert, wie es auf beiden Geräten ist! (IPhone/iPad)
  • Wenn Einbetten Bei der Verwendung von -> UIView wird die neue Ansicht ein wenig größer als der Subview sein. Sie müssen es genau auf die Unteransicht anpassen. Bevor Sie jedoch die Größe ändern, müssen Sie die Subviews für die Autoresize deaktivieren.

Der Code:

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

Es gibt ein Tutorial an Cocoanetics, die genau diese Sache tut.

+0

Dies funktioniert nur, wenn Sie einen statischen farbigen Hintergrund verwenden, wird nicht auf Bildhintergründen funktionieren, da dieses Tutorial einen farbigen Farbverlauf über der Ansicht hinzufügt, die Sie "ausblenden" möchten – Hjalmar

1

Hier iKiR und Mazyod Antwort, übersetzt Xamarin.iOS (Monotouch). Beachten Sie, dass es keine Notwendigkeit, Rechtecken vor und nach dem Gradienten zu ziehen, wenn man nur die richtigen Flaggen auf denen die DrawLinearGradient Methode übergeben:

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;