2014-12-03 4 views
0

У меня есть UITableViewCell, у которого есть UIView (gradientView), где я хочу применить градиент. Эта ячейка имеет AutoLayout, поэтому я хочу обновить рамку градиента при изменении кадра gradientView.CAGradientLayer в UITableViewCell

Я попытался следующие, но ни один из них не работал:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 
    self.gradient.frame = self.gradientView.bounds; 
} 

-(void)updateConstraints{ 
    [super updateConstraints]; 
    self.gradient.frame = self.gradientView.bounds; 
} 

-(void)updateConstraintsIfNeeded{ 
    [super updateConstraintsIfNeeded]; 
    self.gradient.frame = self.gradientView.bounds; 
} 

также я не могу использовать это внутри клетки:

- (void)viewDidLayoutSubviews{} 

ответ

1

Я бы предложил создать новый подкласс UIView которого защитный слой (layerClass) является CAGradientLayer. Примените цвета по мере необходимости. Когда меняется вид bounds, iOS будет внутренне изменять размер layer.

Если вы хотите сделать это еще проще, просто возьмите здесь OBGradientView и используйте его в своем проекте. https://github.com/ole/OBGradientView

+0

Вы можете показать пример? – rob180

+0

https://github.com/ole/OBGradientView Просто поместите это в свой проект и используйте этот подкласс UIView. – rounak

1

Лично я всегда использую КВО для изменения слоев кадра , Поместите эту строку после загрузки ячеек (-(void)awakeFromNib, если вы используете IB/раскадровки). Важно, чтобы эта строка была вызвана только один раз в жизни ячеек!

[self.gradientView.layer addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil]; 

затем просто реализовать этот метод:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
    if(object==self.gradientView.layer && self.gradient.superlayer!=nil){ 
     CGRect newFrame = [change[NSKeyValueChangeNewKey] CGRectValue]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.gradient.frame = newFrame; 
     }); 
    } 
} 

я ставлю обновление кадров в dispatch_async блоке, так как без него слой не был обновлен.

И не забудьте удалить наблюдателя, например. в dealloc:

-(void)dealloc{ 
    [self.gradientView.layer removeObserver:self forKeyPath:@"bounds"]; 
} 
+0

, который работал, у меня только один вопрос. когда представление таблицы i проектирует первый раз, когда градиент соответствует анимации. Любая идея почему? – rob180

+0

@ rob180 nope, может быть, 'gradienView' или' gradient' кадр 'CGRectZero' в начале, и поэтому iOS решает оживить это большое изменение в размере? – Kegluneq

+0

они не ноль, я должен найти способ отключить эту анимацию – rob180

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