如何以编程方式将 UISegmentedControl 添加到容器视图
Posted
技术标签:
【中文标题】如何以编程方式将 UISegmentedControl 添加到容器视图【英文标题】:How to programmatically add a UISegmentedControl to a container view 【发布时间】:2011-10-05 00:20:24 【问题描述】:如何定义UISegmentedControl
的框架?
我希望分段控件出现在container view
的底部,即UIView
。
【问题讨论】:
快速试用的 Swift 模板代码:github.com/mfaani/QuickTry/blob/main/ios/UIKit/… 【参考方案1】:这个是完美的,我测试过.....
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,您可以查看 this 网址。
【讨论】:
如果您成功了,请将此答案标记为正确,以便对其他人有所帮助。 2年快过去了,但答案仍然没有被接受!不过帮了我!谢谢! 完全被低估了。这是我的 +1。 不错!只是一个快速更新:segmentedControlStyle 现在在 ios7 上已贬值 @SOFY 我认为他已经死亡或入狱,因为答案不被接受。 :-)【参考方案2】: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];
-
创建一个数组来存储段的值
使用数组初始化段
在屏幕上为其分配一个位置并调整控件的大小
将其指向在用户与其交互时调用的方法
选择一个默认值(在本例中为 Dos)
将其放在主视图上
然后创建当用户更改值时调用的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 来改进它。
【讨论】:
【参考方案3】:斯威夫特:
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
【讨论】:
【参考方案4】:试试这个链接:
ADDING A SEGMENTED CONTROL PROGRAMMATICALLY
更新:
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.
来源:http://www.richardhsu.me/
【讨论】:
【参考方案5】:要以编程方式将 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];
如有任何疑问,请联系我。
【讨论】:
【参考方案6】:这适用于所有类型的 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];
【讨论】:
【参考方案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,请将其中任何一个标记为您的解决方案。对于初学者来说,找出最简单和正确的解决方案将很有用。【参考方案8】:你可以这样做......
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];
第 2 步:
-(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;
【讨论】:
以上是关于如何以编程方式将 UISegmentedControl 添加到容器视图的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将元素添加到 ConfigurationElementCollection?
如何在 Swift 中以编程方式将 UILabel 对象居中?
如何以编程方式将 UIImageView 添加到 UIStackView(故事板)