2012-03-17 2 views
4

맞춤 헤더가있는 UITableView가 있습니다. 즉, 직접 UIView를 만듭니다. 보기의 하위 뷰 중 하나의 접근 가능성 프레임을 조정해야하지만 프레임의 좌표를 적절하게 설정하는 방법을 알 수는 없습니다. 즉, 창에 상대적이어야하지만 성취 방법을 모르겠습니다. 그. 내가 VoiceOver를의 목적을 위해 하나에 결합하려는 두 개의 UILabels를 가지고 부모보기가 이동할 요소의 액세스 가능성 프레임 설정

- (UIView *)tableView:(UITableView *)tableView 
viewForHeaderInSection:(NSInteger) section 
{ 
    CGRect bounds = CGRectMake(0, 0, [tableView frame].size.width, 48); 
    UIView *header = [[UIView alloc] initWithFrame:bounds]; 

    UILabel *labelOne = [[UILabel alloc] initWithFrame: 
     CGRectMake(0, 0, bounds.size.width - 80, 18)]; 
    UILabel *labelTwo = [[UILabel alloc] initWithFrame: 
     CGRectMake(0, 20, bounds.size.width - 80, 18)]; 

    CGRect frameOne = [labelOne frame]; 
    CGRect frameTwo = [labelTwo frame]; 

    [labelTwo setIsAccessibilityElement:NO]; 
    [labelOne setAccessibilityFrame:CGRectUnion(frameOne, frameTwo)]; 

    // ... 

    return header; 
} 

처럼

내 코드 보인다. 나는 두 번째 레이블을 무시하고 두 번째 레이블의 영역을 덮기 위해 첫 번째 레이블의 프레임을 확장하여이 작업을 수행합니다. (두 번째 레이블은 첫 번째 레이블 바로 아래에 있습니다.) 문제는 프레임을 가져 오는 것입니다. 위와 같이 코드를 사용하면 접근성 프레임이 올바른 크기가되지만 UITableView의 머리글이 화면의 왼쪽 상단에있는 것처럼 배치됩니다. 코드를 수정하려고 시도했습니다.

CGRect frameOne = [header convertRect:[labelOne frame] toView:nil]; 
CGRect frameTwo = [header convertRect:[labelTwo frame] toView:nil]; 

동일한 문제가 발생했습니다. 이 후자의 코드가 UILabels의 프레임을 윈도우 상대 좌표로 변환하면 안됩니까?

UIView가 만들어 질 때 UI 위치가 화면에 표시 될 위치를 알지 못하고 UITableView의 일부로 스크롤 될 수 있습니다. accessibilityFrame을 호출 할 때마다 UIView의 위치를 ​​확인하는 메시지로 구현해야합니까?

답변

1

정확하게 수행에 도움을 줄 것입니다 도우미 기능이있다 할 [self view] 물어보고 싶은. 이 함수는 CGRect을 사용하고 뷰의 좌표계에서 화면 좌표로 변환합니다.

0

나는 내가 windowtableView:viewForHeaderInSection:가 호출 될 때까지는 nil 임니다해야 생각대로의 UIView가 생성 될 때의 타이밍 생각하지 않습니다. 문제는 convertRect:toView: 메시지의 수신자라고 생각합니다. 이 메시지를 header에 전달하는 대신 [self view]에 전달해야합니다. 당신은 수신기에서 변환하고

이 경우 nil하거나 앱에서 UIWindow에, 또 다른 뷰의 좌표계. header이이 메시지를 받으면 header 좌표계를 window의 좌표계로 변환하지만 header 자체는 [self view]의 하위보기입니다. UIAccessibilityConvertFrameToScreenCoordinates 대신, 당신은 어떤 UINavigationBar 년대 고려해야 변환, 등

CGRect frameOne = [[self view] convertRect:[labelOne frame] toView:nil]; 
CGRect frameTwo = [[self view] convertRect:[labelTwo frame] toView:nil]; 
관련 문제