UISegmentedControl без закругленного угла? - PullRequest
5 голосов
/ 02 декабря 2009

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

Ответы [ 6 ]

20 голосов
/ 03 декабря 2011

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

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

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

Search Bar With Scope

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

BarStyle

Или хуже того ...

BezeledStyle

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

enter image description here

5 голосов
/ 02 декабря 2009

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

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

1 голос
/ 02 ноября 2015

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

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;
1 голос
/ 03 декабря 2009

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

0 голосов
/ 08 июля 2018

Если кому-то все еще интересно, вот простое расширение в 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)

}

}

0 голосов
/ 15 октября 2014

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

    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]; 
...