Ich verwende eine UISlider
in meiner App, möchte aber ein benutzerdefiniertes "Look-and-Feel" dafür verwenden. Ich habe den Daumen zu meinem eigenen Bild geändert, aber gibt es eine Möglichkeit, die Leiste auch zu ändern? Ich habe ein Balkenbild, das ich gerne verwenden würde, kann aber nicht sehen, wie das geht.
Ich habe herausgefunden, wie man das Max- und Min-Bild ändert, aber nicht die Leiste selbst.
Sie hatten Recht, -setMinimumTrackImage:forState:
- und -setMaximumTrackImage:forState:
-Methoden zu verwenden. Was Sie verpasst haben, ist, dass Sie ihnen dehnbare UIImage
zur Verfügung stellen sollten.
UIImage *sliderLeftTrackImage = [[UIImage imageNamed: @"SliderMin.png"] stretchableImageWithLeftCapWidth: 9 topCapHeight: 0];
UIImage *sliderRightTrackImage = [[UIImage imageNamed: @"SliderMax.png"] stretchableImageWithLeftCapWidth: 9 topCapHeight: 0];
[mySlider setMinimumTrackImage: sliderLeftTrackImage forState: UIControlStateNormal];
[mySlider setMaximumTrackImage: sliderRightTrackImage forState: UIControlStateNormal];
Sie können dasselbe Bild für die minimalen und maximalen Teile verwenden.
Die einfachste Lösung wäre, einen UIImage hinter dem Steuerelement wiederzugeben, um die Spur darzustellen. Der Daumenknopf kann geändert werden mit:
[mySlider setThumbImage:[UIImage imageNamed:@"thumb_image.png"] forState:UIControlStateNormal];
Ein Nebeneffekt ist, dass der Track nur dann gerendert wird, wenn Sie Ihren eigenen angeben. In Kombination mit dem UIImage erhalten Sie einen benutzerdefinierten UISlider, ohne dass Sie irgendetwas unterordnen müssen.
Wenn Sie den UISlider in einem Storyboard definieren, befindet sich der Slider am besten in der Unterklasse der Ansicht. In awakeFromNib können Sie die linke und rechte Spur der Schaltfläche ändern.
Dieser Aufruf ist in iOS 5 stretchableImageWithLeftCapWidth:topCapHeight:
veraltet.
- (void)awakeFromNib
{
[super awakeFromNib];
UIImage *thumbImage = [UIImage imageNamed:@"slider-button"];
[self.slider setThumbImage:thumbImage forState:UIControlStateNormal];
UIImage *sliderLeftTrackImage = [UIImage imageNamed: @"slider-fill"];
sliderLeftTrackImage = [sliderLeftTrackImage resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch];
UIImage *sliderRightTrackImage = [UIImage imageNamed: @"slider-track"];
sliderRightTrackImage = [sliderRightTrackImage resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch];
[self.slider setMinimumTrackImage:sliderLeftTrackImage forState:UIControlStateNormal];
[self.slider setMaximumTrackImage:sliderRightTrackImage forState:UIControlStateNormal];
}
stretchableImageWithLeftCapWidth: ist seit iOS 5.0 veraltet. Die Dokumente geben an, stattdessen die Eigenschaft 'capInsets' zu verwenden. Hier ist eine einfache Möglichkeit, dies zu tun:
Erstellen Sie drei Bilder, die minimale (linke) Spur, die maximale (rechte) Spur und den Daumen. Nehmen Sie für dieses Beispiel an, dass die minimalen und maximalen Spurbilder 34p x 18p sind. und das:
.
Erstellen Sie die Bilder wie gewohnt:
UIImage *thumbImage = [UIImage imageNamed:@"sliderThumb.png"];
UIImage *sliderMinTrackImage = [UIImage imageNamed: @"sliderMin.png"];
UIImage *sliderMaxTrackImage = [UIImage imageNamed: @"sliderMax.png"];
Für meine 18 Punkte breiten Bildbeispiele kann der innere Punkt auf der linken und rechten Seite entsprechend der Spur gedehnt werden, aber die Enden sollten nicht dehnbare Kappengrößen aufweisen, die 17 Punkte breit sind (daher capInsets):
sliderMinTrackImage = [sliderMinTrackImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 17, 0, 0)];
sliderMaxTrackImage = [sliderMaxTrackImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 17)];
Stellen Sie dann die Bilder wie gewohnt auf Ihrem UISlider ein:
[slider setThumbImage:thumbImage forState:UIControlStateNormal];
[slider setMinimumTrackImage:sliderMinTrackImage forState:UIControlStateNormal];
[slider setMaximumTrackImage:sliderMaxTrackImage forState:UIControlStateNormal];
Hier können Sie ein Spurbild hinzufügen, das nicht gestreckt ist, sodass Sie z. eine Keilform im Hintergrund, wie es vom OP verlangt wurde:
Swift 3.0:
let trackImg = image.resizableImage(withCapInsets: .zero, resizingMode: .tile)
slider.setMinimumTrackImage(trackImg, for: .normal)
slider.setMaximumTrackImage(trackImg, for: .normal)
Wichtig: Stellen Sie sicher, dass die Breite Ihres Schiebereglers genau der Breite des Bildes entspricht!
Sie müssen die Unterklasse UISlider und überschreiben:
- (CGRect)trackRectForBounds:(CGRect)bounds
Diskussion Sie sollten dies nicht nennen Methode direkt. Wenn du möchtest Passen Sie das Spurrechteck an Überschreiben Sie diese Methode und geben Sie eine .__ zurück. anderes Rechteck. Das zurückgegebene Rechteck wird zum Skalieren der Spur verwendet und Daumenbilder während des Zeichnens.
Ich mache das zwar, aber die hintere Leiste wird in iOS 5.1 nicht perfekt angezeigt, in iOS 6.0 jedoch die Anzeige
hier ist mein code
UIImage *stetchLeftTrack = [[UIImage imageNamed:@"spectrum_horizontal_bar.png"]
stretchableImageWithLeftCapWidth:15.0 topCapHeight:0.0];
UIImage *stetchRightTrack = [[UIImage imageNamed:@"spectrum_horizontal_bar.png"]
stretchableImageWithLeftCapWidth:15.0 topCapHeight:0.0];
[self.slider_Sprectrum setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
[self.slider_Sprectrum setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];