2013-09-07 19 views
5

böylece gibi:Eğimli bir gölgeyi nasıl çizebilirim?

enter image description here

Bunu, NSShadow ile çalışmaz drawRect: bunu çizim sadece iyi çalışır biliyorum.

+0

Gölge uygulamak için ne yapıyorsunuz? –

+0

@ Pétur Hiçbir şey yok, "NSGradient" veya benzer bir şey kullanarak çizmek istiyorum. Ne demek istediğimi anlıyor musun? – NSAddict

+0

Bir çeşit gölge düşürmeyi mi planlıyorsunuz? –

cevap

5

Ç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.

enter image description here

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); 

Sadece aynı tekniği kullanılarak oluşturulabilir dışındaki gölgeler bazı örnekler göstermek; Bu

enter image description here

gibi bir yol bu

enter image description here

+0

Bu harika! Bu gece deneyeyim ve sana geri döneceğim – NSAddict

+0

Mükemmel çalışıyor, teşekkürler bir demet! – NSAddict

1

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

Image

.

  1. oval
  2. oval alt ile kesişen bir dikdörtgen çizmek.
  3. CMD sol üst köşedeki "Nesneler" listesinde hem dikdörtgeni hem de oval'i tıklatın.
  4. Araç Çubuğundaki Kesiştir düğmesine basın.
  5. Nesneler listesinden Bezier'i seçin.
  6. "Hayır İnme"
  7. olan Kontur Set (Seçim Müfettiş aşağıda solda yer alan) Gradyan butonuna
  8. basın "+" düğmesine
  9. Değiştir açık gri degrade rengi tıklayın. Eğer memnun kadar

gradyan ayarlamak Doğrusal: Seçim denetçisi itibaren

  • Dolgu Stil için "Gradient"
  • Seç Gradyan değiştirin.

  • +0

    Birçok düzeyde ilgi çekici. –

    +0

    Ç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

    2

    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

    Resulting shadow

    - (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.

    +0

    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. –

    +0

    Ayrıca, burada yaptığım gibi üst kenar boşluğundan çok uzak çizmeyi planlıyorsanız, degradeyi kırpmanız gerekir. –

    +0

    Bu yararlı olabilir, teşekkürler! Biraz zamanım olduğunda bunu deneyeceğim ve size geri döneceğim – NSAddict

    1
    - (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.

    +0

    '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. –

    İlgili konular