Есть ли способ избавиться от закругленных углов UISegmentedControl или это поведение по умолчанию?
UISegmentedControl без закругленного угла?
Ответы (6)
Нет, API, который дает вам контроль над расположением сегментов, отсутствует.
Возможно, вы могли бы попробовать просмотреть view.subviews UISegmentedControl и попытаться изменить их в соответствии с вашими потребностями. Но по личному опыту я бы так не советовал. Если Apple изменит свой порядок в будущем, ваше приложение, вероятно, выйдет из строя. Проще всего создать пользовательские UIButtons, которые ведут себя как кнопки-переключатели и управлять ими как UISegmentedControls (для кнопок-переключателей см. Как использовать UIButton в качестве переключателя).
Есть кое-что очень простое, что вы можете сделать, чтобы избавиться от закругленного мусора в UISegmentedControl... измените стиль на "7". Я не шучу. Я только что понял это:
// Magic number ... (it's cheating, but it works)
mySegmentedBar.segmentedControlStyle = 7;
Это тот же стиль управления, который они используют на панели области видимости UISearchBar, например:
Но если кому-то нужна только полоса обзора без поиска, они обычно застревают в мусоре UISegmentedControl, подобном этому (с закругленными углами):
Или, что еще хуже, это...
К счастью, переключившись на стиль бара «7», мы получаем точный вид стоп-бара без всех подклассов и хакерства drawRect:
Если вам нужен другой вид, вы можете просто подклассировать его и сделать свой собственный рисунок в -drawRect:
. См. Руководство по программированию Quartz 2D. для справки по рисованию с Quartz/Core Graphics.
Добавив границу разумной ширины, вы можете получить квадратный вид:
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;
После множества попыток я получил решение ниже, которое отлично работает без фонового изображения или подкласса:
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];
Если кому-то все еще интересно, вот простое расширение для 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)
}
}