2013-05-15 2 views
3

동적으로 폭을 변경하는 장면 내부 UITableView 있습니다. 너비가 바뀌면 UITableView을 포함하여 장면 확장을 움직입니다.애니메이션 사용자 정의보기는 내 응용 프로그램에서

UITableView에는 사용자 정의보기가있는 섹션 헤더가 있으며 여기에는 UILabel이 포함되어 있으며보기의 오른쪽에 고정되어 있습니다.

내 장면 변화의 폭, 정말 같은 테이블의 크기 조정 애니메이션 때 :

[UIView animateWithDuration:0.22 
         delay:0.02 
        options:UIViewAnimationOptionCurveLinear 
       animations:^ 
{ 
    //Change width to 320 from 220 
    [menuTable setFrame:CGRectMake(menuTable.frame.origin.x, menuTable.frame.origin.y, 320, menuTable.frame.size.height)]; 
} 
       completion:^(BOOL finished) 
{ 

}]; 

이 원활 테이블의 크기 조정을 애니메이션하지만, 섹션 헤더 내부의 라벨이 최종 목적지로 아빠를 - 움직이지 않습니다. 내가 reloadData 전화 해봤

-이 같은 효과, 아니 애니메이션이 있습니다. 나는 beginUpdatesendUpdates을 호출하려했지만 효과가 없습니다.

그 외 무엇을 시도해야합니까? 라벨 확장 내 실험에서

+0

자동 레이아웃을 사용하고 있습니까? – rdelmar

+0

UILabel 's는 텍스트 변경 사항에 애니메이션을 적용하지 않습니다. 레이블에 배경색을 설정하면 레이블 프레임이 제대로 움직이는 것을 볼 수 있습니다. 텍스트는 기다렸다가 제자리로 이동합니다. 텍스트가 어떻게 움직이는지를 완벽하게 제어하려면 UILabel의 하위 클래스가 필요합니다. –

+0

@rdelmar - autolayout을 사용하고 있습니다. – BreadicalMD

답변

1

, 내가 뭘 라이언 Poolos 그의 주석에서 말했다 것은 사실 발견 - 레이블이 애니메이션으로 확장하는 경우에도, 텍스트가 새로운 위치로 이동합니다 (I는 함께이 일을했습니다 가운데 정렬로 설정된 텍스트).

그래서 작품, 내가 찾은 유일한 방법과 같이, 타이머를 사용하는 것입니다

-(IBAction)expandLabel:(id)sender { 

    [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(expand:) userInfo:nil repeats:YES]; 
} 

-(void)expand:(NSTimer *) aTimer { 
    self.widthCon.constant += 1; 
    if (self.widthCon.constant >= 200) [aTimer invalidate]; 
} 

widthCon 내가 레이블에 넣어 너비 제약 조건을 함께 IBOutlet입니다. 자동 레이아웃을 사용하는 경우 프레임을 변경하는 대신 구속 조건을 변경하여 애니메이션을 수행해야합니다. 섹션 머리글에서 레이블로 시도하지 않았지만이 메서드를 사용하여 테이블의 너비를 움직이게하고 레이블의 제약 조건이 테이블의 확장을 따르는 방식으로 설정되면 작동한다고 가정합니다. 편집 후

: 타이머 방법은 너무 라벨을 이동 (보다는 확장)을 위해 일 할 수있는 유일한 방법처럼

더 실험 후에는 보인다. 이 경우 너비 제약 조건은 테이블 뷰 자체에 적용됩니다.

더 많은 실험 : 두 번째 편집 후

. 문제가 layoutIfNeeded 대신 layoutSubviews (직접 호출해서는 안 됨)를 호출하고 있음을 알게되었습니다. 따라서 타이머없이 레이블 위치를 애니메이션으로 만들 수 있습니다. 헤더를 만들 때 사용한 코드는 다음과 같습니다.

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UITableViewHeaderFooterView *view = [[UITableViewHeaderFooterView alloc] init]; 
    view.tintColor = [UIColor yellowColor]; 
    UILabel *label = [[UILabel alloc] init]; 
    [label setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    label.backgroundColor = [UIColor redColor]; 
    label.text = @"Test"; 
    [view.contentView addSubview:label]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[label]-|" options:0 metrics:nil views:@{@"label":label}]]; 
    [view addConstraint:[NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; 
    return view; 
} 

-(IBAction)expandTable:(id)sender { 
    self.widthCon.constant = 300; 
    [UIView animateWithDuration:1 animations:^{ 
     [self.view layoutIfNeeded]; 
    }]; 
} 
+0

레이블의 너비는 실제로 변경되지 않고 위치 만 변경됩니다. 그래서 Ryan Poolos가 말한 바에 따르면 너비 변경에 대해서는 사실이지만 위치 변경에 대해서는 적어도이 경우 문제가되지 않습니다. 타이머를 사용하여 레이블의 프레임을 수동으로 움직일 수는 있지만 꽤 어렵습니다. 마지막 수단이되고 싶습니다. 섹션 헤더 뷰에 애니메이션을 적용해야 함을 나타내는 방법이 있어야합니다. – BreadicalMD

+0

@BreadicalMD, Ok, 죄송합니다. 귀하의 문제를 오해했습니다. 그러나 제약 조건을 적용하여 애니메이션을 적용하라는 충고는 여전히 남아 있습니다. 제약 조건을 사용하여 테이블의 너비 변경을 애니메이션화하면 레이블 위치가 올바르게 따라야합니다. 나는 그것을 반영하기 위해 나의 대답을 업데이트 할 것이다. – rdelmar

+0

작동하지 않습니다 그 중 하나 :(그리고 불행하게도, 그 애니메이션에서 테이블 자체를 중단 시도해도 - 그 폭이 이용 애니메이션보다는 즉시 변경의 'self.tableWidth.constant = 320; [UIView의 animateWithDuration :. 0.22 지연 : 0.02 선택해 UIViewAnimationOptionCurveLinear 애니메이션^{ [menuTable layoutSubviews] [self.view layoutSubviews] } 완료^(BOOL 완료) {}] ' – BreadicalMD

관련 문제