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
и поместите этот код там.