böylece gibi:Eğimli bir gölgeyi nasıl çizebilirim?
Bunu, NSShadow
ile çalışmaz drawRect:
bunu çizim sadece iyi çalışır biliyorum.
böylece gibi:Eğimli bir gölgeyi nasıl çizebilirim?
Bunu, NSShadow
ile çalışmaz drawRect:
bunu çizim sadece iyi çalışır biliyorum.
Çekirdek Animasyon katmanları ve shadowPath
özelliğini kullanarak bu ve diğer birçok gölgeyi yapabilirsiniz. Tanımladığınız gölge, eliptik gölge yolu ile yapılabilir.
bu gölge üretmek için kod altındadır. Gölgenin yuvarlak şeklini almak için elipsin boyutunu ayarlayabilirsin. Katmandaki gölge özelliklerini kullanarak konum, opaklık, renk ve bulanıklık yarıçapını da ayarlayabilirsiniz.
self.wantsLayer = YES;
NSView *viewWithRoundShadow = [[NSView alloc] initWithFrame:NSMakeRect(30, 30, 200, 100)];
[self addSubview:viewWithRoundShadow];
CALayer *backingLayer = viewWithRoundShadow.layer;
backingLayer.backgroundColor = [NSColor orangeColor].CGColor;
// Configure shadow
backingLayer.shadowColor = [NSColor blackColor].CGColor;
backingLayer.shadowOffset = CGSizeMake(0, -1.);
backingLayer.shadowRadius = 5.0;
backingLayer.shadowOpacity = 0.75;
CGRect shadowRect = backingLayer.bounds;
CGFloat shadowRectHeight = 25.;
shadowRect.size.height = shadowRectHeight;
// make narrow
shadowRect = CGRectInset(shadowRect, 5, 0);
backingLayer.shadowPath = CGPathCreateWithEllipseInRect(shadowRect, NULL);
gibi bir yol bu
Bunu kodda nasıl yapacağınızı veya bu kodu sizin için oluşturan bir aracın nasıl kullanıldığını açıklayabilirim. Sonunu seçiyorum. PaintCode (mevcut ücretsiz demo, oturum başına 1 saat sınırı) kullanarak
.
gradyan ayarlamak Doğrusal: Seçim denetçisi itibaren
Birçok düzeyde ilgi çekici. –
Çabalarınızı takdir ediyorum ama bu ihtiyacım olandan çok uzak. İhtiyacım olan gölge, sadece soldan sağa doğru değil, aynı zamanda yukarıdan aşağıya doğru da değişiyor. Bu "NSGradient" ile mümkün değil, bu yüzden farklı bir yaklaşım arıyorum. Bir süre önce PaintCode aldım, başka benzer özellikler sunmuyor. – NSAddict
Kusursuz olmaktan çok uzak ama sanırım aradığınız gölge türünü çiziyor. Tamamen siyahtan net bir renge doğru düz bir doğrusal gradyanı bıraktığımı unutmayın. Bu kadar karanlık olmanız, bu değerleri biraz değiştirmediğiniz sürece size süper gerçekçi bir gölge vermeyecektir. Sevdiğiniz herhangi bir adımı atmak için farklı alfa değerleriyle daha fazla yer ekleyerek degrade ile oynamak isteyebilirsiniz. Bazı deneyler muhtemelen gereklidir, ancak değerlerin hepsi oynamak için vardır.
Öneriniz doğrultusunda drawRect:(CGRect)rect
bir şeydir. Sadece özel bir görünüm oluşturmak ve sadece bunu geçersiz: Ben sadece yapabildiğiniz gölge üzerinde ancak, bir resim yerleştirilir
- (void)drawRect:(CGRect)rect {
// Get the context
CGContextRef context = UIGraphicsGetCurrentContext();
// Setup the gradient locations. We just want 0 and 1 as in the start and end of the gradient.
CGFloat locations[2] = { 0.0, 1.0 };
// Setup the two colors for the locations. A plain black and a plain black with alpha 0.0 ;-)
CGFloat colors[8] = { 0.0f, 0.0f, 0.0f, 1.0f, // Start color
0.0f, 0.0f, 0.0f, 0.0f }; // End color
// Build the gradient
CGGradientRef gradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(),
colors,
locations,
2);
// Load a transformation matrix that will squash the gradient in the current context
CGContextScaleCTM(context,1.0f,0.1f);
// Draw the gradient
CGContextDrawRadialGradient(context, // The context
gradient, // The gradient
CGPointMake(self.bounds.size.width/2,0.0f), // Starting point
0.0f, // Starting redius
CGPointMake(self.bounds.size.width/2,0.0f), // Ending point
self.bounds.size.width/2, // Ending radius
kCGGradientDrawsBeforeStartLocation); // Options
// Release it an pray that everything was well written
CGGradientRelease(gradient);
}
Bu benim ekranda nasıl göründüğünü olduğunu ... UIImageView alt sınıfını kullanırsanız ve drawRect yöntemini geçersiz kılarsanız, gölgeyi bir görüntü ile kolayca birleştirin.
Gördüğünüz gibi, yaptığım şey basitçe dairesel bir degrade oluşturmaktı; ancak, bunu bağlamı çizmeden önce onu ölçeklemek için bir ölçekleme matrisi yükledim. Bu yöntemde başka bir şey yapmayı planlıyorsanız, matrisin yerinde olduğunu ve yaptığınız her şeyin deforme olacağını unutmayın.Matrisi yüklemeden önce CTM'yi CGContextSaveGState()
ile kaydetmek ve ardından orijinal durumu CGContextRestoreGState()
ile geri yüklemek isteyebilirsiniz.
Şerefe.
Ah Bundan bahsetmeyi unuttum, çünkü benim örneğimde 0.1f indeksi olan her şeyi eziyorum, bu da görüşün yüksekliğinin onda biri kadar bir gölge alacağınız anlamına geliyor. Bunu ayarladıysanız, gölgenizi görmek için görünümünüzü yeterince büyütün. Bu kodu gerçekten nereye yerleştirmek istediğinize bağlı olarak, gölgeyi gerçek görünüm boyutuna daha yakın olacak şekilde bazı çarpanları yerleştirmeniz gerekir. Sadelik uğruna bu kısmı atladım. –
Ayrıca, burada yaptığım gibi üst kenar boşluğundan çok uzak çizmeyi planlıyorsanız, degradeyi kırpmanız gerekir. –
Bu yararlı olabilir, teşekkürler! Biraz zamanım olduğunda bunu deneyeceğim ve size geri döneceğim – NSAddict
- (void)viewDidLoad
{
UIImage *natureImage = [UIImage imageNamed:@"nature.jpg"];
CALayer *layer = [CALayer layer];
layer.bounds = CGRectMake(0, 0, 200, 200);
layer.position = CGPointMake(380, 200);
layer.contents = (id)natureImage.CGImage;
layer.shadowOffset = CGSizeMake(0,2);
layer.shadowOpacity = 0.70;
layer.shadowPath = (layer.shadowPath) ? nil : [self bezierPathWithCurvedShadowForRect:layer.bounds].CGPath;
[self.view.layer addSublayer:layer];
}
- (UIBezierPath*)bezierPathWithCurvedShadowForRect:(CGRect)rect {
UIBezierPath *path = [UIBezierPath bezierPath];
CGPoint topLeft = rect.origin;
CGPoint bottomLeft = CGPointMake(0.0, CGRectGetHeight(rect) + offset);
CGPoint bottomMiddle = CGPointMake(CGRectGetWidth(rect)/2, CGRectGetHeight(rect) - curve);
CGPoint bottomRight = CGPointMake(CGRectGetWidth(rect), CGRectGetHeight(rect) + offset);
CGPoint topRight = CGPointMake(CGRectGetWidth(rect), 0.0);
[path moveToPoint:topLeft];
[path addLineToPoint:bottomLeft];
[path addQuadCurveToPoint:bottomRight controlPoint:bottomMiddle];
[path addLineToPoint:topRight];
[path addLineToPoint:topLeft];
[path closePath];
return path;
}
bu size yardımcı olacaktır Umut gibi bir gölge üretecek.
'osx' etiketini gördünüz mü? IOS kodunun OSX'e çevrilemediğini söylemiyorum ama bu işi yapan siz olmalısınız. –
Gölge uygulamak için ne yapıyorsunuz? –
@ Pétur Hiçbir şey yok, "NSGradient" veya benzer bir şey kullanarak çizmek istiyorum. Ne demek istediğimi anlıyor musun? – NSAddict
Bir çeşit gölge düşürmeyi mi planlıyorsunuz? –