更改 UISegmentedControl 的高度

4

我正在尝试使用以下代码更改UISegmentedControl的高度:

CGRect frame= mySegmentedControl.frame;
[mySegmentedControl setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, fNewHeight)];

但是它不起作用。有人知道为什么吗?如果我在界面构建器中取消勾选分段控件的“使用自动布局”功能,它实际上可以工作,但是由于某些原因,分段控件中的项目变得不可点击...

这是接下来的问题,我仍然没有找到一种简单的方法来向UISegmentedControl添加多行文本(任何帮助都将不胜感激)。


UISegmentedControl的高度不应该被改变,正如您从IB中看到的那样。如果您想要那种外观和感觉,请创建一个自定义组件。 - tipycalFlow
你所说的自定义组件是什么意思,是指非 UISegmentedControl 吗? - user1903992
7个回答

9
似乎是关于视图周期的问题。
在iOS中布局视图实际上涉及3个因素: 1.自动布局(自iOS6以来可用) 2.设置frame 3.自动调整大小掩码
对于您的情况,
自动布局将帮助计算所需的框架(基于NSLayouConstraints)为该UIView然后将它们布局。
因此,在界面构建器中,如果启用“自动布局”,则界面构建器为该UIView生成NsLayoutConstraints。 如果禁用“自动布局”,则构建器为您的UIView生成一个框架。
假设您必须使用自动布局,则必须在正确的时间内调整UISegmentedControl的大小。
- (void)viewDidLayoutSubview

这是关于视图生命周期的内容。简单来说,它就像:

updateConstraints -> layout(你最好观看相关的 WWDC Session 视频以了解详情)

你不能直接改变 frame,因为会出现以下流程:

通过代码设置新的 frame -> 视图处理约束和计算(为 UISegmentedControl 生成另一个 frame) -> 进行布局

对于这个不够清晰的回答,我感到抱歉。


4
也许这可以帮到你: 我在Storyboard视图中使用了自定义大小的UISegmentedControl。Storyboard视图使用了AutoLayout,每次我按下其中一个选项卡时,UISegmentedControl都会调整为默认高度,而不是自定义框架大小。
我的解决方案:
1)在-(void)viewDidLoad: 中设置UISegmentedControl框架:
[mySegControl setFrame:CGRectMake(100, 170, 568, 100)];

2) 在-(void)viewDidLayoutSubviews:中设置框架:

[mySegControl setFrame:CGRectMake(100, 170, 568, 100)];

3) 当选择一个片段时,使用作为目标的方法中调用setNeedsLayout。这将强制UISegmentedControl根据您的自定义框架大小进行重新布局。

[self.view setNeedsLayout];

我需要额外添加一步操作,即在我的viewDidLoad函数开头添加mySegControl.translatesAutoresizingMaskIntoConstraints = true(Swift)(否则每次单击分段控件时它都会跳动)。 - Joseph

3

对我来说,我正在使用这个 mySegmentedControl.frame=CGRectMake(236, 178, 171, 35);,它的效果非常好。

你检查过frame值了吗?


2

幸运的是,您也可以从xib中更改高度。

您可以通过xib来进行操作。只需将分段控件添加到xib中。然后在TextEdit中打开xib。您会发现以下代码:

<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="B99-Tt-vJG">

<rect key="frame" x="222" y="82" width="123" height="44"/>

在这里,您可以将高度从44更改为任何所需的高度。您可以像这样更改任何UIConponent的高度。即使是对于UIPickerView也是如此。


2
要在接口生成器中完成此操作,您可以选择控件并在“用户定义的运行时属性”下添加框架属性。请参考以下截图:adding frame attribute inside Interface Builder

1
第一步:创建一个@IBOutlet,将其连接到你的UISegmentedControl,就像这样-
 @IBOutlet weak var segemntControl: UISegmentedControl!

然后,在你的viewDidLoad()中添加这行代码 -

segemntControl.frame.size.height = 50 

0

风险方法,但您也可以通过更改其约束条件并添加高度约束来更新高度


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