2013-10-08 2 views
3

다른 사람들과 마찬가지로 UITableViewCell 클리핑을 사용하여 동일한 문제가 발생했습니다. 다른 사람이 올바르게 지적한대로 셀의 contentView에 새로운 수퍼 뷰가 있습니다.iOS 7 UITableViewCell 클립 TEMPORARILY

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"HomeTableViewCell"; 
    ItemCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if(!cell) 
    { 
     cell = [[ItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     //add views here as subviews to cell.contentView. Set them tags and retrieve later. 
    } 

    cell.clipsToBounds = FALSE; 
    cell.layer.masksToBounds = FALSE; 
    cell.contentView.clipsToBounds = FALSE; 
    cell.contentView.layer.masksToBounds = FALSE; 
    cell.contentView.superview.clipsToBounds = FALSE; 
    cell.contentView.superview.layer.masksToBounds = FALSE; 

    [self loadCell:cell inTable:tableView atIndexPath:indexPath]; 

    return cell; 
} 

loadCell: inTable: atIndexPath: 태그에 의해 셀의 서브 뷰를 검색하고 적절한 내용을로드 : 그래서 나는이했다. 괜찮아. clipToBounds 또는 layer.masksToBounds에 대한 다른 언급이 없습니다. 하지만 : 내가 선택한 셀을 다시로드하면, 임시로 클립이 경계에 도달 한 다음 위의 코드에 도달하여 올바르게 가져옵니다. 그래서 약 1-2 초 동안 나는 세포를 잘랐다. 이것은 ItemCell 내부에서 일어나는 일입니다. 방금이 클래스를 만들어 clipToBounds 속성을 TRUE로 바꾸는 것을 확인했습니다.

@implementation ItemCell 

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    if((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) 
    { 
     [self addObserver:self forKeyPath:@"layer.masksToBounds" options:NSKeyValueObservingOptionNew context:nil]; 
     [self addObserver:self forKeyPath:@"clipsToBounds"   options:NSKeyValueObservingOptionNew context:nil]; 
    } 

    return self; 
} 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSNumber *nr = [change objectForKey:@"new"]; 
    if(nr.intValue) 
    { 
     self.clipsToBounds = FALSE;  // STAY FALSE!! 
     self.layer.masksToBounds = FALSE; 
    } 
} 

TRUE로 설정하면 FALSE로 설정 되더라도 클리핑/언 클립 사이의 간격은 여전히 ​​유지됩니다. 그것은 단지 작습니다. 그것은 iOS6에서 발생하지 않았습니다. clipsToBounds 속성이 true로 전환 할 때 스택 추적, 당신은 CALayer setMasksToBounds가 자동으로 호출되는 것을 볼 수 있습니다

enter image description here

사람이 어떤 수정의 어떤 생각을 가지고 있습니까? 고맙습니다!

+0

나는 비슷한 문제가 있다고 생각한다. – djskinner

+0

해결책을 찾으면 알려주십시오. 나는 지금까지 아무 것도 얻지 못했고, 많은 프로젝트를 진행했고, 작은 결함은 관리자가 '받아 들일 수있는'것으로 선언 했으므로 더 이상 작업하지 않았습니다. 그러나 나는 여전히 호기심이 많다. – George

답변

3

지금 내 코드에서이 문제가 해결 된 것 같습니다. 첫째 있는지 모든 것을 다음 코드의 모든 또는 일부 조합 등을 클리핑에 대한 인터페이스 빌더에서 설정되어 있는지 확인하는 것은 필요하다고 나타납니다

tableView:willDisplayCell:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //ios 7 cell background fix 
    [cell.contentView.superview setClipsToBounds:NO]; 
    [cell.contentView setClipsToBounds:NO]; 
    [cell setClipsToBounds:NO]; 
    [cell setBackgroundColor:[UIColor clearColor]]; 
    //ios 7 content clipping fix 
    [cell.contentView.superview setClipsToBounds:NO]; 
    [cell.contentView setClipsToBounds:NO]; 
    [cell setClipsToBounds:NO]; 
} 
에서

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    //ios7 hacks 
    [cell.contentView.superview setClipsToBounds:NO]; 
    [cell.contentView setClipsToBounds:NO]; 
    [cell setClipsToBounds:NO]; 
    return cell; 
} 

tableView:cellForRowAtIndexPath:에서

+0

응답 해 주셔서 감사합니다. 나는 'willDisplayCell'을 사용하여이 작업을 실제로 시도했지만 불행히도 그 작업은 불가능했습니다. – George

+0

적용 할 수있는 다른 한가지는 애니메이션을 끝내는 것입니다. 단지'beginUpdates'와'endUpdates'가 아닌'reloadData'를 사용하는 것입니다. 분명히 이상적인 해결책은 아닙니다! – djskinner

+0

2 개의 셀을 새로 고침하고 있습니다. 이전에 선택한 것과 새로 선택한 것. 시작 및 종료 업데이트는 더 많은 작업을 수행하고 한 번에 애니메이션을 적용하려는 경우에 사용됩니다. 한 행을 삭제하고 다른 행을 업데이트하고 다른 행을 삽입하는 것과 같이 각 행에 애니메이션을 적용하는 것과 같이 사용합니다. 나는 'UITableViewCellAnimationNone'을 사용하려고 노력할 것입니다. 그러나 AFAIK에는 여전히 거기에 관여 된 일부 애니메이션이 있습니다 (테이블에 관한 WWDC 비디오에서 이것을 보았습니다.) 감사합니다! – George