Cocoa Touch - Добавяне на текстура с насложен изглед

Имам набор от плочки като UIViews, които имат програмируем цвят на фона и всяка може да бъде с различен цвят. Искам да добавя текстура, като странично осветена фаска, към всеки един. Може ли това да се направи с изглед с наслагване или по някакъв друг метод?

Търся предложения, които не изискват персонализиран файл с изображение за всеки случай.


person Jim    schedule 10.11.2011    source източник


Отговори (3)


Това може да помогне на някого, въпреки че е съставено от други теми на SO. За да създам изображение със скосена плочка с произволен цвят за нормален и за ретина дисплей, направих скосено изображение във Photoshop и зададох наситеността на нула, създавайки изображение в сива скала, наречено tileBevel.png

tileBevel.png

Създадох и такъв за дисплея на ретината ([email protected])

Ето кода:

+ (UIImage*) createTileWithColor:(UIColor*)tileColor {

    int pixelsHigh = 44;
    int pixelsWide = 46;
    UIImage *bottomImage;

    if([UIScreen respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) {
        pixelsHigh *= 2;
        pixelsWide *= 2;
        bottomImage = [UIImage imageNamed:@"[email protected]"];        
    }
    else {
        bottomImage = [UIImage imageNamed:@"tileBevel.png"];
    }

    CGImageRef theCGImage = NULL;
    CGContextRef tileBitmapContext = NULL;

    CGRect rectangle = CGRectMake(0,0,pixelsWide,pixelsHigh);

    UIGraphicsBeginImageContext(rectangle.size);

    [bottomImage drawInRect:rectangle];

    tileBitmapContext = UIGraphicsGetCurrentContext();

    CGContextSetBlendMode(tileBitmapContext, kCGBlendModeOverlay);

    CGContextSetFillColorWithColor(tileBitmapContext, tileColor.CGColor);        
    CGContextFillRect(tileBitmapContext, rectangle);

    theCGImage=CGBitmapContextCreateImage(tileBitmapContext);

    UIGraphicsEndImageContext();

    return [UIImage imageWithCGImage:theCGImage];

}

Това проверява дали се използва дисплеят на ретината, оразмерява правоъгълника за рисуване, избира подходящото основно изображение в сивата скала, настройва режима на смесване на наслагване, след което рисува правоъгълник върху долното изображение. Всичко това се прави в графичен контекст, ограден от извикванията BeginImageContext и EndImageContext. Те задават текущия контекст, необходим на метода UIImage drawRect:. Основните графични функции се нуждаят от контекста като параметър, който се получава чрез извикване за получаване на текущия контекст.

И резултатът изглежда така:

въведете описание на изображението тук

person Jim    schedule 11.11.2011

Ако искате да запазите алфа канала на изходното изображение, просто добавете това към кода на jim преди запълващия правоъгълник:

// Apply mask
CGContextTranslateCTM(tileBitmapContext, 0, rectangle.size.height);
CGContextScaleCTM(tileBitmapContext, 1.0f, -1.0f);

CGContextClipToMask(tileBitmapContext, rectangle, bottomImage.CGImage);
person Scriptease    schedule 12.02.2012

Решение Swift 3, основно базирано на отговора на Jim с добавка на Scriptease и някои дребни промени:

class func image(bottomImage: UIImage, topImage: UIImage, tileColor: UIColor) -> UIImage? {
    let pixelsHigh: CGFloat = bottomImage.size.height
    let pixelsWide: CGFloat = bottomImage.size.width

    let rectangle = CGRect.init(x: 0, y: 0, width: pixelsWide, height: pixelsHigh)
    UIGraphicsBeginImageContext(rectangle.size);

    bottomImage.draw(in: rectangle)

    if let tileBitmapContext = UIGraphicsGetCurrentContext() {
        tileBitmapContext.setBlendMode(.overlay)
        tileBitmapContext.setFillColor(tileColor.cgColor)
        tileBitmapContext.scaleBy(x: 1.0, y: -1.0)
        tileBitmapContext.clip(to: rectangle, mask: bottomImage.cgImage!)
        tileBitmapContext.fill(rectangle)
        let theCGImage = tileBitmapContext.makeImage()
        UIGraphicsEndImageContext();

        if let theImage = theCGImage {
            return UIImage.init(cgImage: theImage)
        }
    }

    return nil
}
person Duncan Babbage    schedule 05.05.2017