2012-10-01 17 views
12

Pracuję nad aplikacją, w której nagłówek sekcji powinien znajdować się po prawej zamiast domyślnej lewej.Nagłówek sekcji UITableView po prawej zamiast domyślnej po lewej

Szukałem i wielu maniaków zaproponował wdrożenie:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    static UIView *headerView; 

    if (headerView != nil) 
     return headerView; 

    NSString *headerText = NSLocalizedString(@"البحث الأخيرة", nil); 

    // set the container width to a known value so that we can center a label in it 
    // it will get resized by the tableview since we set autoresizeflags 
    float headerWidth = 150.0f; 
    float padding = 10.0f; // an arbitrary amount to center the label in the container 

    headerView = [[UIView alloc] initWithFrame:CGRectMake(300, 0.0f, headerWidth, 44.0f)]; 
    headerView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

    // create the label centered in the container, then set the appropriate autoresize mask 
    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(padding, 0, headerWidth - 2.0f * padding, 44.0f)]; 
    headerLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
    headerLabel.textAlignment = UITextAlignmentRight; 
    headerLabel.text = headerText; 

    [headerView addSubview:headerLabel]; 

    return headerView; 
} 

Jednak gdy próbuję zwiększyć współrzędna x nagłówka ramki widoku, nie ma wpływu na pozycję widoku. I zawsze w środku widoku tabeli.

Potrzebuję nagłówek, aby być po prawej stronie.

+0

Zamiast iść z flexibleWidth, nie można zmusić go do być pełną szerokość? Następnie widok zużyje całą szerokość i uzasadni tekst w prawo. – bryanmac

+0

Już wybrałeś odpowiedź, która jest w większości poprawna, ale dodanie spacji w celu uzyskania marginesu to prawdziwy hack. Właściwym sposobem rozwiązania problemu jest utworzenie pustego widoku (lub jednego z kolorem tła) i użycie go jako widoku nagłówka. Następnie dodajesz UILabel do tego widoku kontenera i przesuwasz go nieco z prawej strony. Ta koncepcja - używanie pustego widoku jako kontenera do umieszczania innych widoków jest powszechnym i użytecznym narzędziem. –

+0

@DavidH masz rację. Pomysł dodawania spacji nie jest dobry. Choć na razie zadziałało to dla mnie.Jak wspomniałem w moim pytaniu, że widok zawsze znajduje się w centrum, w miejscu, w którym potrzebuję go po prawej stronie. Ustawienie ramki nie działa. Etykieta została wyrównana do prawej. Rozumiem, że używanie UIView jest o wiele lepsze, gdy masz więcej opcji dostosowywania. Dziękuję za komentarz! –

Odpowiedz

15

ten pracował dla mnie, jednak grać z współrzędnymi ramy, aby dostosować w zależności od potrzeb

-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UILabel *label = [[UILabel alloc] init]; 
    [email protected]"header title"; 
    label.backgroundColor=[UIColor clearColor]; 
    label.textAlignment = NSTextAlignmentRight; 
    return label; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return 50; 
} 
+1

Tak, poprawnie, zakładając, że UILabel jest podklasą uiview –

+1

Dzięki! Zadziałało :). Jednak rozpoczęcie tekstu prawie dotykało granicy widoku. Dodałem trochę spacji do tekstu, a teraz tekst jest nieco przesunięty w lewo. –

+3

'UITextAlignmentRight' jest przestarzałe, należy użyć' NSTextAlignmentRight' –

0

firt wszystkim ja nie init UIView z

headerView = [[UIView alloc] initWithFrame:CGRectMake(300, 0.0f, headerWidth, 44.0f)]; 

Od swojej pochodzenia współrzędna X będzie 300.For nagłówek i footerviews ustawić swoją pochodzenie współrzędnych CGPoint (0.0) i po prostu grać z wielkości.

Postaraj się, aby etykieta była tak duża, jak widok sam i ustaw jej wyrównanie w prawo.

UIView *headerTitleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)]; 

UILabel *sectionTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, headerTitleView.frame.size.width, 40)]; 
sectionTitleLabel.backgroundColor = [UIColor clearColor]; 
sectionTitleLabel.textAlignment = UITextAlignmentright; 

Kolejną możliwością jest dodanie UIlabel gdzieś po prawej stronie widoku nagłówka z wyrównaniem do środka.

0

Nie jestem pewien, czy rozumiem sytuację, ale jestem przy założeniu, że po prostu chcesz etykieta do wyrównania w prawo zamiast w lewo.

Dostosowanie wartości ramki dla widoku nagłówka nie będzie działać, ponieważ tabelaView jest odpowiedzialna za pozycjonowanie go i będzie ignorować wszelkie wartości tutaj ustawione.

Jedyną opcją jest praca z subskrybcjami headerView.

przykład ustawienie pozycji headerLabel być wyrównane do prawej:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    static UIView *headerView; 

    if (headerView != nil) 
     return headerView; 

    NSString *headerText = NSLocalizedString(@"البحث الأخيرة", nil); 

    float headerWidth = 320.0f; 
    float padding = 10.0f; 

    headerView = [[UIView alloc] initWithFrame:CGRectMake(300, 0.0f, headerWidth, 44.0f)]; 
    headerView.autoresizesSubviews = YES; 

    // create the label centered in the container, then set the appropriate autoresize mask 
    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, headerWidth, 44.0f)]; 
    headerLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth; 
    headerLabel.textAlignment = UITextAlignmentRight; 
    headerLabel.text = headerText; 

    CGSize textSize = [headerText sizeWithFont:headerLabel.font constrainedToSize:headerLabel.frame.size lineBreakMode:UILineBreakModeWordWrap]; 
    headerLabel.frame = CGRectMake(headerWidth - (textSize.width + padding), headerLabel.frame.origin.y, textSize.width, headerLabel.frame.size.height); 

    [headerView addSubview:headerLabel]; 

    return headerView; 
} 
+0

wyrównanie jest już ustawione na prawo. –

7

miałem problemów ze zmianą tekst z powyższego roztworu, to pracował dla mnie i miejscach z właściwego odstępu od krawędzi spływu widok tabeli. PS Rozwiązanie w Swift

UITableViewDataSource

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 30 
} 

UITAbleViewDelegate

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return "Header Title" 
} 

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 

    let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView 
    header.textLabel?.font = UIFont(name: "AvenirNext-Regular", size: 14.0) 
    header.textLabel?.textAlignment = NSTextAlignment.Right 

} 
Powiązane problemy