4 Stimmen

Das Festlegen des accessibilityFrame eines Elements, dessen übergeordnete Ansicht sich bewegen wird.

Ich habe eine UITableView mit einem benutzerdefinierten Header (dh ich erstelle die UIView selbst). Ich muss den accessibilityFrame eines der Unterviews der Ansicht anpassen, aber ich kann nicht herausfinden, wie ich die Koordinaten des Rahmens angemessen setzen kann - sie müssen relativ zum Fenster sein, aber ich weiß nicht, wie ich das erreichen soll.

Mein Code sieht wie folgt aus

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

Ich habe zwei UILabels, die ich für die Zwecke von VoiceOver kombinieren möchte. Dies erreiche ich, indem ich das zweite Label ignorieren und den Rahmen des ersten Labels erweitern, um den Bereich des zweiten Labels abzudecken. (Das zweite Label befindet sich direkt unter dem ersten.) Das Problem ist das Erhalten der Rahmen. Wenn ich den Code wie oben gezeigt verwende, ist der Zugriffsrahmen die richtige Größe, wird jedoch so positioniert, als ob der Header der UITableView in der linken oberen Ecke des Bildschirms wäre. Ich habe versucht, den Code zu ändern, um zu sagen

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

aber dasselbe ist passiert. Sollte dieses letztere Stück Code nicht die Rahmen der UILabels in fensterbezogene Koordinaten umwandeln?

Ich dachte vielleicht, das Problem ist, dass die UIView beim Erstellen nicht weiß, wo sie auf dem Bildschirm positioniert wird (und als Teil einer UITableView kann sie überall hin gescrollt werden). Ist es notwendig, accessibilityFrame als eine Nachricht zu implementieren, die die Position der UIView jedes Mal überprüft, wenn sie aufgerufen wird?

2voto

Kasper Munck Punkte 4163

Es gibt eine Hilfsfunktion, die Ihnen dabei hilft, genau das zu tun: UIAccessibilityConvertFrameToScreenCoordinates. Diese Funktion nimmt ein CGRect und konvertiert es aus dem Koordinatensystem einer Ansicht in Bildschirmkoordinaten.

0voto

greg Punkte 4633

Ich glaube nicht, dass es am Zeitpunkt liegt, wann die UIView erstellt wird, da ich davon ausgehe, dass das window zum Zeitpunkt des Aufrufs von tableView:viewForHeaderInSection: nicht-nil sein sollte. Ich denke das Problem liegt beim Empfänger der Nachricht convertRect:toView:. Anstatt diese Nachricht an header weiterzuleiten, sollten Sie sie an [self view] weiterleiten.

Sie konvertieren vom Koordinatensystem des Empfängers in das eines anderen Ansicht, in diesem Fall nil oder des UIWindow in Ihrer App. Wenn header diese Nachricht erhält, konvertieren Sie vom Koordinatensystem von header in das Koordinatensystem von window, aber header selbst ist eine Unteransicht von [self view]. Stattdessen möchten Sie [self view] bitten, die Konvertierung durchzuführen, die alle UINavigationBar's etc. berücksichtigen sollte.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X