2012-03-17 43 views
4

我有一個自定義標題的UITableView(即我自己創建UIView)。我需要調整視圖的其中一個子視圖的accessibilityFrame,但我無法弄清楚如何適當地設置框架的座標 - 它們需要相對於窗口,但我不知道如何完成那。設置其父視圖將移動的元素的accessibilityFrame

我的代碼看起來像

- (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; 
} 

我有兩個UILabels,我想結合成一個VoiceOver會的目的。我通過忽略第二個標籤並擴展第一個標籤的框架來覆蓋第二個標籤的區域來實現這一點。 (第二個標籤緊靠第一個標籤。)問題在於獲取框架。如果我使用上面顯示的代碼,那麼可訪問性框架是正確的大小,但定位好像UITableView的標題位於屏幕的左上角。我試圖修改代碼說

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

但發生同樣的事情。不應該這後一段代碼將UILabels的幀轉換爲窗口相對座標嗎?

我想也許問題是,當創建UIView時,它不知道它將在屏幕上的位置(作爲UITableView的一部分,它可能滾動到整個地方)。是否有必要實現accessibilityFrame作爲一個消息,每次調用UIView的位置時都會檢查它的位置?

回答

0

我不認爲這是在創建UIView時的時間,因爲我相信window應該是不可─nil的時候tableView:viewForHeaderInSection:被調用。我認爲這個問題是convertRect:toView:消息的接收者。您不應將此消息傳遞給header,而應將其傳遞給[self view]

你從接收器轉換座標系統到另一種意見認爲,在這種情況下nil或應用程式的UIWindow。當header收到此消息時,您將從header座標系轉換爲window的座標系,但header本身是[self view]的子視圖。相反,你要問[self view]做轉換,應考慮任何UINavigationBar的等

CGRect frameOne = [[self view] convertRect:[labelOne frame] toView:nil]; 
CGRect frameTwo = [[self view] convertRect:[labelTwo frame] toView:nil]; 
相關問題