2010-10-23 19 views
6

Dokunulduğunda bir UIImageView koyulaştırmak gerekir, tam olarak tam olarak Springboard (ana ekran) üzerindeki simgeler gibi.nasıl bir UIImageView koyulatmak için

0,5 alfa ve siyah arka plan ile UIView eklenmelidir. Bu beceriksiz görünüyor. Katmanlar veya bir şey kullanmalı mıyım (CALayers).

+0

bunun yerine bir 'UIButton' kullanmak mümkün mü? –

cevap

4

UIView alt sınıflandırma ve UIImage ivar (görüntü olarak adlandırılır) ekleme hakkında ne dersiniz? O zaman, bir kenara atılırken basılan bir boolean ivar'ın olması koşuluyla, böyle bir şeyi -drawRect'i geçersiz kılabilirsiniz.

- (void)drawRect:(CGRect)rect 
{ 
[image drawAtPoint:(CGPointMake(0.0, 0.0))]; 

// if pressed, fill rect with dark translucent color 
if (pressed) 
    { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 0.5); 
    CGContextFillRect(ctx, rect); 
    CGContextRestoreGState(ctx); 
    } 
} 

Yukarıdaki RGBA değerleri ile denemek isteyebilirsiniz. Ve, tabii ki, dikdörtgen olmayan şekiller biraz daha fazla iş gerektirecektir - CGMutablePathRef gibi.

+1

Söz konusu UIImage'ın bir alt sınıfta yer alması UIView zaten bunu yapabilirim. Ancak bunu neden drawRect yönteminde yapardım, doğrudan dokunuşlarda yapamadım mı? –

+0

Bazı ayarları değiştirmek gerekiyorsa, bu dokunmalarda gerçekleşir. Ve geri dokunuşlar içinde değiştirilmiş olabilir. Ama asıl çizim, bence, drawRect'te gerçekleşir. UIView alt sınıf örneğinizde, değiştirilmiş durum değişiklikleriyle birlikte setNeedsDisplay öğesini çağırmanız gerekebilir. (Bu özel setterde en iyi şekilde yapılabilir.) UIImageView alt sınıfının drawRect'in geçersiz kılınması durumunda nasıl davranacağından emin değilim. Bu yüzden temelde kendi UIImageView'ınızı yazmanın 'daha güvenli' yaklaşımını önerdim. Bu yardımcı olur umarım. – westsider

+0

yorumumu yanlış anladınız, neden özel çizim drawRect'te gerçekleşiyor? Neden bütün CGContext kodlarını koyamıyorum? –

1

UIImageView çoklu görüntülere sahip olabilir; Görüntünün iki versiyonuna sahip olabilir ve gerektiğinde daha karanlık bir görünüme geçebilirsiniz.

6

Bir UIImageView resmin gerçek çizimini işlemesine izin verir, ancak görüntüyü önceden kararmış olan bir görünüme dönüştürür. İşte bazı kod ben alfa ile Darkened görüntüleri muhafaza oluşturmak için kullandım oluyor:

+ (UIImage *)darkenImage:(UIImage *)image toLevel:(CGFloat)level 
{ 
    // Create a temporary view to act as a darkening layer 
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    UIView *tempView = [[UIView alloc] initWithFrame:frame]; 
    tempView.backgroundColor = [UIColor blackColor]; 
    tempView.alpha = level; 

    // Draw the image into a new graphics context 
    UIGraphicsBeginImageContext(frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [image drawInRect:frame]; 

    // Flip the context vertically so we can draw the dark layer via a mask that 
    // aligns with the image's alpha pixels (Quartz uses flipped coordinates) 
    CGContextTranslateCTM(context, 0, frame.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextClipToMask(context, frame, image.CGImage); 
    [tempView.layer renderInContext:context]; 

    // Produce a new image from this context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage *toReturn = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    UIGraphicsEndImageContext(); 
    [tempView release]; 
    return toReturn; 
} 
+0

Teşekkürler! Aradığım şey bu. – VietHung

İlgili konular