В попытке разрешить высоту UISlider, корректирующуюся неправильно , я провел кучу исследований и экспериментов и обнаружил, что могу переопределить класс UISlider и реализовать свои собственные thumbImageForState
и trackRectForBounds
методы.нарисовать все в моем желаемом размере.На данный момент у меня есть следующее
@implementation SeekBar
- (CGRect)trackRectForBounds:(CGRect)bounds
{
// Creates a track that is 1/4th the height of the View,
// centered in the View's bounds
return CGRectMake(0, bounds.size.height * 3 / 8, bounds.size.width, bounds.size.height / 4);
}
- (UIImage *)thumbImageForState:(UIControlState)state
{
// For all states, just generate a circle whose height
// and width is based on our bounds
float radius = MIN(self.bounds.size.height, self.bounds.size.width);
UIGraphicsBeginImageContext(CGSizeMake(radius, radius));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1, 1, 1, 1);
CGContextFillEllipseInRect(context, CGRectMake(0, 0, radius, radius));
UIImage *thumbRect = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return thumbRect;
}
@end
Это «работает», так как я могу переопределить класс UISlider, и я могу наблюдать за изменениями внешнего вида панели, когда я изменяю эти два метода,Я могу изменить цвет круга, изменить ширину дорожки и т. Д.
Однако последний круг, сгенерированный с помощью thumbImageForState
, превышает границы ползунка и обрезается.См. Изображение ниже (не обращайте внимания на метки UIL, правильное определение их размеров - мой следующий проект):
Внимательно посмотрите на левую и нижнюю части круга, и вы увидите, что он обрезан.Почему это происходит?Я устанавливаю ограничивающий прямоугольник для эллипса, чтобы он точно совпадал с высотой ползунка, поэтому он не должен быть слишком высоким.Кроме того, ползунок намного шире эллипса, поэтому он не должен быть слишком широким.