CGContextFillEllipseInRect выходит за границы - PullRequest
0 голосов
/ 19 сентября 2019

В попытке разрешить высоту 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, правильное определение их размеров - мой следующий проект):

enter image description here

Внимательно посмотрите на левую и нижнюю части круга, и вы увидите, что он обрезан.Почему это происходит?Я устанавливаю ограничивающий прямоугольник для эллипса, чтобы он точно совпадал с высотой ползунка, поэтому он не должен быть слишком высоким.Кроме того, ползунок намного шире эллипса, поэтому он не должен быть слишком широким.

...