UISegmentedControl без закругленного угла?

Есть ли способ избавиться от закругленных углов UISegmentedControl или это поведение по умолчанию?


person Robert Childan    schedule 02.12.2009    source источник


Ответы (6)


Нет, API, который дает вам контроль над расположением сегментов, отсутствует.

Возможно, вы могли бы попробовать просмотреть view.subviews UISegmentedControl и попытаться изменить их в соответствии с вашими потребностями. Но по личному опыту я бы так не советовал. Если Apple изменит свой порядок в будущем, ваше приложение, вероятно, выйдет из строя. Проще всего создать пользовательские UIButtons, которые ведут себя как кнопки-переключатели и управлять ими как UISegmentedControls (для кнопок-переключателей см. Как использовать UIButton в качестве переключателя).

person Dimitris    schedule 02.12.2009

Есть кое-что очень простое, что вы можете сделать, чтобы избавиться от закругленного мусора в UISegmentedControl... измените стиль на "7". Я не шучу. Я только что понял это:

    // Magic number ... (it's cheating, but it works)
  mySegmentedBar.segmentedControlStyle = 7;  

Это тот же стиль управления, который они используют на панели области видимости UISearchBar, например:

Панель поиска с областью действия

Но если кому-то нужна только полоса обзора без поиска, они обычно застревают в мусоре UISegmentedControl, подобном этому (с закругленными углами):

BarStyle

Или, что еще хуже, это...

BezeledStyle

К счастью, переключившись на стиль бара «7», мы получаем точный вид стоп-бара без всех подклассов и хакерства drawRect:

введите здесь описание изображения

person Greg Combs    schedule 02.12.2011
comment
Это считается частным API? - person jjxtra; 27.11.2012
comment
@GregCombs, это было давно, хотелось бы получить ответ по этому поводу ^ пожалуйста, когда у вас есть время - person GangstaGraham; 28.08.2013
comment
Эээ... вроде бы, но не совсем? Вы не вызываете какие-либо методы, к которым у вас нет доступа, но используете целочисленное значение, не имеющее общеизвестного ключа. Я не слышал ни о ком (включая меня), кто был бы наказан за это. Тем не менее, iOS 7, похоже, делает этот вопрос спорным, поскольку все состоит из текста с тонкими контурами. - person Greg Combs; 04.09.2013

Если вам нужен другой вид, вы можете просто подклассировать его и сделать свой собственный рисунок в -drawRect:. См. Руководство по программированию Quartz 2D. для справки по рисованию с Quartz/Core Graphics.

person Daniel Tull    schedule 03.12.2009

Добавив границу разумной ширины, вы можете получить квадратный вид:

self.segmentedControl.tintColor = [UIColor brownColor];
self.segmentedControl.layer.cornerRadius = 0.0;
self.segmentedControl.layer.borderColor = [UIColor brownColor].CGColor;
self.segmentedControl.layer.backgroundColor = [UIColor colorWithWhite:1 alpha:0.75].CGColor;
self.segmentedControl.layer.borderWidth = 1.5f;
self.segmentedControl.layer.masksToBounds = YES;
person Mantas Laurinavičius    schedule 02.11.2015

После множества попыток я получил решение ниже, которое отлично работает без фонового изображения или подкласса:

    mySegmentedControl.tintColor = [UIColor clearColor]; //Clear all border

    //Draw your own border
    mySegmentedControl.layer.borderColor = [UIColor blackColor].CGColor;
    mySegmentedControl.layer.borderWidth = 1.0;

    //Set tint color for selected subview
    UIColor *tintcolor=[UIColor redColor];
    int subViewIndex = 0; //index which is selected
    [[_segmentControl.subviews objectAtIndex:subViewIndex] setTintColor:tintcolor]; 
person sanjana    schedule 15.10.2014

Если кому-то все еще интересно, вот простое расширение для Swift 4 (iOS 11). Просто убедитесь, что вы установили цвет оттенка перед вызовом этого метода. Если после этого вы измените цвет оттенка, обязательно снова вызовите этот метод:

extension UISegmentedControl {

func ignoreCornerRadius() {

    let renderer = UIGraphicsImageRenderer(size: bounds.size)

    let normalImage = renderer.image { (context) in
        tintColor.setStroke()
        context.stroke(bounds)
    }
    let selectedImage = renderer.image { (context) in
        tintColor.setFill()
        context.fill(bounds)
    }

    setBackgroundImage(normalImage, for: .normal, barMetrics: .default)
    setBackgroundImage(selectedImage, for: .selected, barMetrics: .default)

}

}

person Jovan Stankovic    schedule 08.07.2018