3

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

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

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

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

4

5 回答 5

8

似乎是关于视图周期。

在 iOS 中布局视图实际上涉及 3 个因素 1. 自动布局(自 iOS6 起可用) 2. setFrame 3. 自动调整掩码

对于你的情况,

自动布局将帮助计算该 UIView 所需的框架(基于 NSLayouConstraints)然后布置它们。

因此,在界面构建器中,如果启用“自动布局”,界面构建器将为该 UIView 生成 NsLayoutConstraints。如果您禁用“自动布局”,则构建器正在为您生成 UIView 框架。

假设你必须使用自动布局,你必须在正确的时间调整你的 UISegmentedControl

- (void)viewDidLayoutSubview

这是关于视图生命周期的。为了简化它,它就像:

updateConstraints -> 布局(您最好观看相关的 WWDC 会议视频了解详情)

您无法更改框架,因为此流程:

通过代码设置新框架 -> 查看句柄约束和计算(为 UISegmentedControl 生成另一个框架) -> 进行布局

很抱歉这个没有组织的答案。

于 2012-12-19T08:02:54.483 回答
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 重新布局 IAW 您的自定义帧大小

[self.view setNeedsLayout];
于 2013-03-19T15:57:34.547 回答
3

对我来说,我正在使用它 mySegmentedControl.frame=CGRectMake(236, 178, 171, 35);,它就像一个魅力。

你检查帧值了吗?

于 2012-12-19T08:05:03.457 回答
2

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

您也可以通过 这样做xib。只需在xib. 然后xib在 TextEdit 中打开。在那里你会找到代码:

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

于 2014-03-12T06:36:00.770 回答
2

要在 Interface Builder 中执行此操作,您可以在“用户定义的运行时属性”下选择控件并添加框架属性

在 Interface Builder 中添加 frame 属性

于 2014-08-30T21:19:53.280 回答