iOS: захват границ объекта для -colorWithPatternImage: в категории UIColor?

Есть ли способ получить границы объекта, кто установлен backgroundColor в категории UIColor?

Например, я пытаюсь применить UIColor из изображения, но я хочу, чтобы он соответственно растягивался. Будут ли связанные ссылки делать работу? Или было бы лучше реализовать такой метод в категории UIView?

Обновить:

Вот метод, который устанавливает backgroundColor:

+ (UIColor *)colorWithGradientStyle:(GradientStyle)gradientStyle andColors:(NSArray *)colors {

//Create our background gradient layer
CAGradientLayer *backgroundGradientLayer = [CAGradientLayer layer];

//Set the frame to our object's bounds
backgroundGradientLayer.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);

//To simplfy formatting, we'll iterate through our colors array and create a mutable array with their CG counterparts
NSMutableArray *cgColors = [[NSMutableArray alloc] init];
for (UIColor *color in colors) {
    [cgColors addObject:(id)[color CGColor]];
}

switch (gradientStyle) {
    case linearLeftToRight: {

        //Set out gradient's colors
        backgroundGradientLayer.colors = cgColors;

        //Specify the direction our gradient will take
        [backgroundGradientLayer setStartPoint:CGPointMake(0.0, 0.5)];
        [backgroundGradientLayer setEndPoint:CGPointMake(1.0, 0.5)];

        //Convert our CALayer to a UIImage object
        UIGraphicsBeginImageContext(backgroundGradientLayer.bounds.size);
        [backgroundGradientLayer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * backgroundColorImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return [UIColor colorWithPatternImage:backgroundColorImage];
    }

    case linearTopToBottom:
    default: {

        //Set out gradient's colors
        backgroundGradientLayer.colors = cgColors;

        //Convert our CALayer to a UIImage object
        UIGraphicsBeginImageContext(backgroundGradientLayer.bounds.size);
        [backgroundGradientLayer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * backgroundColorImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return [UIColor colorWithPatternImage:backgroundColorImage];
    }

}

}

1 ответ

Решение

Независимо от того, где вы разместите этот код, вам понадобится ссылка на представление, чтобы получить его границы. Вы можете либо передать представление или границы в качестве параметра, либо поместить его в категорию или подкласс UIView.

Класс UIColor предназначен только для создания цветов, он не имеет ничего общего с их рендерингом или позиционированием. Это работа для UIView. Поэтому UIColor не место для этого кода imho.

Я предлагаю создать подкласс UIView и переопределить drawRect, чтобы нарисовать градиент. Или создайте метод UIView, например: -(void)setBackgroundGradientWithStyle:(GradientStyle)gradientStyle colors:(NSArray *)colors и поместите этот код там.

Другие вопросы по тегам