16 Stimmen

UISlider Highlight-Status mit anderer Daumenbreite als normal

Ich versuche, einen benutzerdefinierten UISlider (Unterklasse von UISlider) zu implementieren, der sich ähnlich wie der native Schieberegler verhält, der ein Glühen um den Daumen hat, wenn er hervorgehoben ist. Ich habe Probleme mit diesem, obwohl.

Die (effektive) Breite des hervorgehobenen Daumens ist offensichtlich größer als die des normalen Daumens (wegen des Leuchtens). Wenn ich dem normalen Bild eine transparente Pixelauffüllung hinzufüge, so dass beide Bilder die gleiche Breite haben, sieht es so aus, als ob der normale Daumen nie das Ende der Spur erreicht (er erreicht zwar das Ende, aber die Auffüllung lässt ihn anders erscheinen).

Wenn ich thumbRectForBounds: verwende, um den Daumen so zu verschieben, dass er korrekt mit dem Anfang der Spur ausgerichtet ist, wird das Problem am anderen Ende nur noch schlimmer.

Wenn ich beide Bilder nur so breit halte, wie sie sein müssen (d.h. kein Padding im normalen Zustand, und die beiden sind nicht gleich breit), bin ich schon näher dran. Ich kann den Versatz unabhängig in thumbRectForBounds: auf der Grundlage der UIControl.state, aber es scheint, wie die es gibt einige mathematische Magie geht hinter den Kulissen. Der einzige Ort, an dem der UISlider denkt, dass die Bilder für beide Zustände perfekt aufgereiht sind, ist die genaue Mitte.

Es scheint, wie ich einige Mathematik, die den Versatz der Highlight-Status auf der Grundlage seiner relativen Position entlang der Spur bestimmt implementieren müssen. Es müsste ein y-Offset von Null in der Mitte (der UISlider würde beide Bilder zentrieren, was bedeutet, dass sie ausrichten). An den Extremen bräuchte es einen y-Offset, der das Glühen vollständig ausgleicht. Und dazwischen müsste es den y-Versatz interpolieren.

Dies scheint eine Menge Arbeit zu sein, um etwas neu zu erstellen, was der native Schieberegler tut, obwohl, so vielleicht bin ich etwas offensichtlich übersehen.

Update Aktuelle Lösung:

Es ist nicht vollständig übertragbar, da es einige Annahmen über die Größe des hinzugefügten Glows macht. Ich füge das Glühen mit einem Bild hinzu, anstatt es direkt in den CALayer zu zeichnen. Ich habe nicht getestet, wie leistungsfähig dies ist noch.

Im Wesentlichen erstelle ich eine quadratische Ebene, deren Abmessungen der Höhe des Standardbildes des Daumens entsprechen, zentriere sie über dem Daumen und zeichne dann das Glühen (nur das Glühen, nicht ein separates Bild des Daumens mit einem Glühen, wie es bei einem Hightlight-Bild der Fall wäre) in diese Ebene.

- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value {
  CGRect r = [super thumbRectForBounds:bounds trackRect:rect value:value];

  [thumbHighlightOverlayLayer removeFromSuperlayer];
  thumbHighlightOverlayLayer = [CALayer layer]; 

  int x = r.origin.x + (r.size.width / 2) - (r.size.height / 2);
  thumbHighlightOverlayLayer.frame = CGRectMake(x, r.origin.y, r.size.height, r.size.height);

  UIImage* thumbHighlightOverlayImage = [UIImage imageNamed:@"thumb-highlight"];
  thumbHighlightOverlayLayer.contents = (id)thumbHighlightOverlayImage.CGImage;

  switch (self.state) {
    case UIControlStateHighlighted:
      [[self layer] addSublayer:thumbHighlightOverlayLayer];
      break;
    default:
      break;
  }

  return r;
}

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