如何通过编程将UISegmentedControl添加到容器视图中

69

如何定义一个UISegmentedControl的外框? 我想让分段控制器显示在包含视图的底部,即UIView


快速尝试的Swift模板代码:https://github.com/mfaani/QuickTry/blob/main/iOS/UIKit/segmentedControl.swift - mfaani
8个回答

184

这一个是完美的,我进行了测试……

UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 435)];
scroll.contentSize = CGSizeMake(320, 700);
scroll.showsHorizontalScrollIndicator = YES;

NSArray *itemArray = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
segmentedControl.frame = CGRectMake(35, 200, 250, 50);
segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;
[segmentedControl addTarget:self action:@selector(MySegmentControlAction:) forControlEvents: UIControlEventValueChanged];
segmentedControl.selectedSegmentIndex = 1;     
[scroll addSubview:segmentedControl];
[segmentedControl release]; 
[self.view addSubview:scroll];

然后在你的类中添加你的方法。

- (void)MySegmentControlAction:(UISegmentedControl *)segment 
{    
    if(segment.selectedSegmentIndex == 0)
    {
        // code for the first button
    } 
}

如果你需要使用已被弃用的UISegmentedControlStyle,可以查看此链接


2
如果您成功了,请将此答案标记为正确,这将对其他人有所帮助。 - Muhammad Rizwan
5
两年已经过去了,但是答案仍未被接受!不过它确实帮助了我!谢谢! - Amogh Talpallikar
1
完全被低估了。这是我的支持。 - Rudy
1
好的!快速更新: segmentedControlStyle现在已经在ios7上废弃了。 - Teffi
5
@SOFY,我认为他因为没有接受答案而已经死了或进了监狱。 :-) - Mohd Sadham

37
请尝试这个链接:

以编程方式添加分段控件

更新:
import UIKit

class ViewController: UIViewController {

  /**
    Loads the view and in our case we override default loadView to provide
    custom SegmentedControl.
  */
  override func loadView() {
      super.loadView()
      self.view.backgroundColor = UIColor.purpleColor()

      println("Main view's loadView() called.")

      // Initialize
      let items = ["Purple", "Green", "Blue"]
      let customSC = UISegmentedControl(items: items)
      customSC.selectedSegmentIndex = 0

      // Set up Frame and SegmentedControl
      let frame = UIScreen.mainScreen().bounds
      customSC.frame = CGRectMake(frame.minX + 10, frame.minY + 50,
                                  frame.width - 20, frame.height*0.1)

      // Style the Segmented Control
      customSC.layer.cornerRadius = 5.0  // Don't let background bleed
      customSC.backgroundColor = UIColor.blackColor()
      customSC.tintColor = UIColor.whiteColor()

      // Add target action method
      customSC.addTarget(self, action: "changeColor:", forControlEvents: .ValueChanged)

      // Add this custom Segmented Control to our view
      self.view.addSubview(customSC)
  }

  /**
    Handler for when custom Segmented Control changes and will change the
    background color of the view depending on the selection.
   */
  func changeColor(sender: UISegmentedControl) {
      println("Change color handler is called.")
      print("Changing Color to ")
      switch sender.selectedSegmentIndex {
      case 1:
          self.view.backgroundColor = UIColor.greenColor()
          println("Green")
      case 2:
          self.view.backgroundColor = UIColor.blueColor()
          println("Blue")
      default:
          self.view.backgroundColor = UIColor.purpleColor()
          println("Purple")
      }
  }

  override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
  }

  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }
}

SOURCE: http://www.richardhsu.me/


22

适用于 Swift 4.x 的更新答案:

class SegmentClass: UIViewController {
    func addControl()  {
        let items = ["Uno", "Dos", "Tres"]
        let segmentedControl = UISegmentedControl(items: items)
        segmentedControl.frame = CGRect(x: 35, y: 200, width: 250, height: 50)
        segmentedControl.addTarget(self, action: #selector(segmentAction(_:)), for: .valueChanged)
        segmentedControl.selectedSegmentIndex = 1
        view.addSubview(segmentedControl)
    }

    @objc func segmentAction(_ segmentedControl: UISegmentedControl) {
        switch (segmentedControl.selectedSegmentIndex) {
        case 0:
            break // Uno
        case 1:
            break // Dos
        case 2:
            break // Tres
        default:
            break
        }
    }
}

Objective-C 的原始回答:

NSArray *itemArray = [NSArray arrayWithObjects: @"Uno", @"Dos", @"Tres", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
segmentedControl.frame = CGRectMake(35, 200, 250, 50);
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents: UIControlEventValueChanged];
segmentedControl.selectedSegmentIndex = 1;
[self.view addSubview:segmentedControl];
  1. 创建一个数组以存储段的值
  2. 使用该数组初始化该段落
  3. 为它分配在屏幕上的位置并调整控件大小
  4. 将其指向用户与之交互时调用的方法
  5. 选择默认值(在本例中为Dos)
  6. 将其放置在主视图上

然后创建segmentAction方法,在用户更改值时调用该方法

- (void)segmentAction:(UISegmentedControl *)segment
{
    switch (segment.selectedSegmentIndex) {
        case 0:
            // Uno
            break;
        case 1:
            // Dos
            break;
        case 2:
            // Tres
            break;
        default:
            break;
    }
}

我更喜欢使用switch语句,因为它更清晰易读。你可以通过创建一个枚举并使用其中的值(optionUno、optionDos、optionTres)代替0、1、2来改进它。


21

你可以这样做...

UISegmentedControl *segmentControl = [[UISegmentedControl alloc]initWithItems:@[@"One",@"Two"]];

[segmentControl setSegmentedControlStyle:UISegmentedControlStyleBar];
segmentControl.frame = CGRectMake(10, 50, 300, 30);
[segmentControl addTarget:self action:@selector(segmentedControlValueDidChange:) forControlEvents:UIControlEventValueChanged];
[segmentControl setSelectedSegmentIndex:0];
[scrollView addSubview:segmentControl];
[segmentControl release];

第二步:

-(void)segmentedControlValueDidChange:(UISegmentedControl *)segment
{
switch (segment.selectedSegmentIndex) {
    case 0:{
        //action for the first button (Current)
        break;}
    case 1:{
        //action for the first button (Current)
        break;}
    }
}

7

步骤1:创建带有索引值的分段控件

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"common-bg.jpg"]];
    [self.navigationItem setHidesBackButton:YES];

    //-- For creating segment control in navigation bar
     UISegmentedControl *mainSegment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Back", @"Month", @"Year", @"Home", nil]];
    [mainSegment setSegmentedControlStyle:UISegmentedControlStyleBar];
    mainSegment.frame = CGRectMake(0,0, 400, 43);
    self.navigationItem.titleView = mainSegment;
    mainSegment.selectedSegmentIndex = 1;
    [mainSegment addTarget:self action:@selector(mainSegmentControl:) forControlEvents: UIControlEventValueChanged];
    [self.view addSubview:mainSegment];
    //--**--

}

步骤2. 创建子视图

- (void)mainSegmentControl:(UISegmentedControl *)segment
{

    if(segment.selectedSegmentIndex == 0)
    {
        // action for the first button (Current or Default)
    }
    else if(segment.selectedSegmentIndex == 1)
    {
        // action for the second button 
    }
    else if(segment.selectedSegmentIndex == 2)
    {
        // action for the third button 
    } 
    else if(segment.selectedSegmentIndex == 3)
    {
        // action for the fourth button 
    }
}

嗨Alede,请将其中任何一个标记为您的解决方案。这对于初学者来识别最简单和正确的解决方案非常有用。 - Rajesh Loganathan

6
为了在容器视图中以编程方式添加UISegmentedControl,请按照以下步骤操作:
// Create UISegmentedControl object to add control UISegment.
UISegmentedControl *objSegment = [[UISegmentedControl alloc] initWithItems:array];

// Set frame for objSegment Control (formate: (x, y, width, height)). where, y = (height of view - height of control). 
[objSegment setFrame:CGRectMake(0, (self.view.frame.size.height - 40), 320, 40)];

// handle UISegmentedControl action.
[objSegment addTarget:self action:@selector(handleSegmentControl:) forControlEvents: UIControlEventValueChanged];

 // Add your UISegmentedControl in your view.
[self.view addSubview:objSegment];

如果您有任何疑问,请联系我。

5

Swift:

let items = ["All Fruits", "Orange", "Grapes", "Banana"]
let filtersSegment = UISegmentedControl(items: items)
filtersSegment.frame = CGRect.init(x: 0, y: 0, width: 300, height: 50)
filtersSegment.selectedSegmentIndex = 0
filtersSegment.tintColor = UIColor.black
filtersSegment.addTarget(self, action: #selector(self.filterApply), for: UIControlEvents.valueChanged)
self.view.addSubview(filterSegment)

@objc private func filterApply(segment: UISegmentedControl) -> Void {
    switch segment.selectedSegmentIndex {
    case 1:
        //Do something for Orange
    case 2:
        //Do something for Grapes
    case 3:
        //Do something for Banana
    default:
        //Do something for All Fruits
    }
}

2

这将适用于所有类型的iOS设备:

UISegment *segment = [[UISegmentedControl alloc] initWithItems:array];
segment.frame = CGRectMake(0, self.view.frame.size.height - 40, 300, 40);
UIFont *font = [UIFont fontWithName:@"DroidSans" size:18.0f];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font
                                                       forKey:NSFontAttributeName];
[segment setTitleTextAttributes:attributes
                                forState:UIControlStateNormal];
[segment addTarget:self action:@selector(segmentAction:) forControlEvents: UIControlEventValueChanged];
[self.view addSubview:segment];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接