2015-06-11 6 views
0

Я хочу добавить графический эффект/градиент, у меня есть класс для UIView. Я выбрал класс в построителе интерфейса.Как повторно использовать код drawRect?

Однако теперь я хотел бы использовать его для просмотра таблицы. Он не позволит мне выбрать один и тот же класс для tableview в построителе интерфейса.

Я не хочу дублировать свой код чертежа, как я могу его переместить?

- (void)drawRect:(CGRect)rect { 
    // Drawing code. 
} 
+0

Почему бы не просто поставить этот пользовательский вид в виде подсмотра в ячейке? –

+0

Это для всего вида таблицы не ячейка, она также может изменить высоту. Я рассматриваю возможность вернуться к теневому подходу, но у меня есть несколько просмотров, и я предпочел бы иметь одну вызывающую строку кода, чем несколько для каждого. Но я зациклился на том, как повторно использовать этот код. Я попытался поместить его в метод, но он не добавил слой, он, похоже, потерял ссылку на представление без ошибки. Есть идеи ? – Jules

+0

поместите это представление под свой вид таблицы, установите цвет фона таблицы для прозрачности, и вам не нужно будет подклассифицировать таблицу, чтобы добиться того же поведения чертежа. Если вам совершенно необходимы отдельные классы - я предлагаю вам добавить метод категории «UIView» с именем, например: '- (void) drawMySuperDuperGradient: (CGRect) rect' - и вы сможете использовать его в любом' UIView' потомок. –

ответ

1

Вместо перекрывая DrawRect вы можете использовать встроенный в теневых методах слоя (в подклассе):

- (void)awakeFromNib { 
    self.yourTableView.layer.shadowOffset = CGSizeMake(2.0, 2.0); 
    self.yourTableView.layer.shadowColor= [UIColor blackColor].CGColor; 
} 
+0

Я на самом деле делаю что-то более сложное с красным кодом, с несколькими цветами. – Jules

+1

Я решил, что это самый простой вариант. – Jules

1

Я предлагаю экономить код DrawRect к изображению, а затем с помощью UIImageView вместо пользовательского Посмотреть. Таким образом, это делается только один раз. Я сделал удобную категорию для UIImage, которая, я думаю, довольно аккуратная.

@implementation UIImage (CustomImage) 

+ (UIImage *)imageOfSize:(CGSize)size withBlock:(void (^)(CGContextRef context))drawingBlock{ 
    UIGraphicsBeginImageContextWithOptions(size, 0, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    UIGraphicsPushContext(context); 
    drawingBlock(context); 
    UIGraphicsPopContext(); 
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return outputImage; 
} 

Вы используете его вот так.

UIImage *myComplicatedPaintImage = [UIImage imageOfSize:tableViewCell.bounds.size withBlock:^(CGContextRef context) { 

    //No need to fetch context, it is provided as block argument 
    CGContextBeginPath(context); 
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextMoveToPoint(context, 123, 456); 
    CGContextAddLineToPoint(context,789,1011); 
    CGContextStrokePath(context); 
} 

Затем просто сохраните ссылку на это изображение, и для всех своих ячеек добавьте его в изображение.

UIImageView *imageView = [UIImageView alloc]initWithFrame:tableViewCell.bounds]; 
imageView.image = myComplicatedPaintImage; 
[self.view insertSubview:imageView atIndex:0]; 
+0

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

+0

@Jules Если вам нужно несколько изображений, то простой старый drawRect - это путь. Если вы пытаетесь дублировать изображение, используйте одно изображение с несколькими изображениями. – dave234

+0

они будут разных размеров, но я хотел бы повторно использовать код, так как он будет подчиняться размеру кадра. – Jules

Смежные вопросы