UIView граница с эффектом затухания или размытия - PullRequest
14 голосов
/ 21 февраля 2010

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

enter image description here

Так что вы можете видеть, что я пытаюсь сделать.

Кто-нибудь может мне помочь?

Ответы [ 5 ]

16 голосов
/ 27 февраля 2010

Я нашел решение - я использовал маску свойств 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 с исчезающей границей

10 голосов
/ 12 июля 2012

Я скажу это сначала, ответа iKiR для меня было более чем достаточно. Я скопировал код как есть, и с небольшим опытом с моей стороны я смог заставить его работать без особых усилий (на UITableView).

  1. Создайте новый подкласс UIView, я назову его MaskingView
  2. импорт QuartzCore рамки!
  3. Вставьте приведенный ниже код в init. (initWithCoder: и / или initWithFrame: в зависимости от ситуации)
  4. Добавьте представление, к которому вы хотите применить растушевку непрозрачности, внутри MaskingView. (В Интерфейсном Разработчике, Редактор пользователя -> Встроить -> Вид. Затем выберите класс нового суперпредставления как MaskingView)
  5. Отдать должное iKiR, потому что я не знаю, как работает код, но он просто работает!

ПРИМЕЧАНИЯ:

  • Я занимаюсь разработкой универсального приложения, и приведенный ниже код работает как на обоих устройствах! (IPhone / IPad)
  • При использовании Embed In -> UIView новый вид будет немного больше подпредставления. Вы должны сделать это точно вписаться в подпредставление. Но, прежде чем изменять его размер, убедитесь, что вы сняли флажок автоматического изменения размера подпредставлений.

Код:

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 голосов
/ 27 сентября 2012

Есть учебник по Кокоанетика , который делает именно эту вещь.

3 голосов
/ 23 февраля 2010

Вы можете попробовать поместить полупрозрачный файл PNG поверх нижней части UITableView.

1 голос
/ 05 сентября 2013

Вот ответ 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...