добавление и удаление слоя поверх UITableViewCell - PullRequest
0 голосов
/ 22 января 2012

У меня есть таблица устройств, которые могут быть подключены или нет.если устройство подключено, имеется переключатель включения / выключения (в виде аксессуара) для управления им.если он отключен, переключаемый заменяется символом отключения.Все идет нормально.Теперь я хочу добавить слой, чтобы затемнить ячейку серым, если она отключена, и, очевидно, слой исчезнет, ​​если он подключен.(Для тестирования, я просто подключил эту кнопку к кнопке для переключения состояния. Я выяснил, как разместить слой, но не могу его удалить. Нажмите один - отобразит слой, щелкните два - ничего не делает, нажмите три -делает слой еще темнее и т. д., пока он не станет полностью черным. Блок вызывается, потому что при каждом щелчке я вижу оператор log: greyString равен 1 "или greyString равен 0. Я пробовал [layer setHidden: YES], [layerremoveFromSuperlayer] и layer.backroughColr = clearColor, без эффекта

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}


NamedUISwitch *mySwitch = [[NamedUISwitch alloc] initWithFrame:CGRectZero];
mySwitch.indexPath = indexPath;
mySwitch.pathRow=indexPath.row;
[mySwitch addTarget:self action:@selector(changeDeviceState:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView=mySwitch;
if ([[plugStates objectAtIndex:indexPath.row] isEqualToString:@"11"]) {
    cell.imageView.image=greenOn;
    mySwitch.on=YES;

}else{
    cell.imageView.image=greenOff;
    mySwitch.on=NO;
}

cell.backgroundView =[[UIImageView alloc] init];
cell.selectedBackgroundView =[[UIImageView alloc] init];


UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [self.tableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];

if (row==1) {
    CALayer *mainLayer=cell.contentView.layer;
    CALayer *greyOut=[CALayer layer];
    CGRect frame = [tableView rectForRowAtIndexPath:indexPath];
    greyOut.frame=CGRectMake(0, mainLayer.frame.origin.y, frame.size.width, frame.size.height);
    CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor;   
    CGColorRef clearColor = [UIColor clearColor].CGColor; 
          greyOut.backgroundColor=darkColor;
    [mainLayer  addSublayer:greyOut]; 

    if ([[[self.plugStates objectAtIndex:1] substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"0"]){
        [greyOut setHidden:NO];
        cell.accessoryView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"disconnect70.png"]];
        NSLog(@"greyString is 0");            

    }else{
         NSLog(@"greyString is 1");
        NSLog(@"superlayer is %@",greyOut.superlayer);
        greyOut.backgroundColor=clearColor;
        [greyOut setHidden:YES];
        //[greyOut removeFromSuperlayer];


    }

}
cell.textLabel.text = deviceName;

return cell;

}

Ответы [ 3 ]

0 голосов
/ 03 октября 2013

У меня была похожая проблема с UICollectionViewCell, которая должна быть такой же, как при использовании табличных представлений.В моем первом подходе я закодировал то же, что вы сделали, и ничего не произошло.

Я решил проблему, просто создав тег UIView, который действовал как контейнер слоя, который я хочу удалить.Это позволило мне перебрать все подпредставления, содержащиеся в UICollectionview (ваш TableView) и удалить UIView, который содержит слой, который я хочу удалить, используя тег.

Код, который я использовал:

//1.- iterate over all subview in order to delete the view tagged as 98. I do this first of all because I don't know at this point if there are any cell already placed
 for (UIView *subview in [globoChat subviews]) {
    if (subview.tag == 98) {
        [subview removeFromSuperview];
    }
}
 //Create the container UIView and then tag it.
  UIView *nuevaVista = [[UIView alloc]initWithFrame:globoChat.bounds];
  nuevaVista.tag=98;

  //create layer
  CALayer *globoPorDebajo = [CALayer layer];
  globoPorDebajo.frame = CGRectMake(0,0,20,20);

   //add layer to the uiview that will contain it
   [nuevaVista.layer addSublayer:globoPorDebajo];

   //add the container view to the parent view
   [globoChat addSubview:nuevaVista];
0 голосов
/ 25 января 2015

У меня была похожая проблема с пользовательским элементом управления на моем виде, слой продолжал добавляться. Я должен был удалить слой, [greyOut removeFromSuperlayer]; как у вас в коде, а затем вызовите метод setNeedsLayout представления, где был добавлен слой. В вашем случае это будет [cell.contentView setNeedsLayout]

0 голосов
/ 22 января 2012

У меня есть приложение, которое затемняет ячейки в зависимости от ситуации, но все, что я сделал, это поместил пустой UIView на всю ячейку и установил цвет фона на черный, а альфа на 0,6 для неактивного состояния и 0,0 для Чисто. Работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...