iOS:更改UISegmentedControl的高度

68

我想改变UISegmentedcontrol的高度,但在Interface Builder中不允许这样做。有没有办法可以修改,还是说不可能实现?

谢谢

16个回答

148

在IB中添加约束也可以实现这一点:

在IB中的约束


你如何添加“蓝色”约束? - Van Du Tran
1
选择 XIB 中的分段控件,编辑器 -> 固定边缘 -> 高度。 - Ji Fang
适用于iOS8+,但不适用于iOS7.0+。在我的应用程序中,分段控件有时会将其高度更改回默认值28。我还实现了-(CGSize)intrinsicContentSize {CGSize defaultSize = [super intrinsicContentSize]; return CGSizeMake(defaultSize.width, 35);}高度为35(因此NSContentSizeLayoutConstraint的高度与NSLayoutConstraint相同),但仍然会出现控件有时跳回默认高度28的情况。 - Vladimír Slavík
这是最好的答案。我在8.4和9.0上都尝试过,它们都可以工作!非常感谢。 - Septronic
1
在Storyboard屏幕本身的正下方,靠近w Any hAny,有4个按钮。点击最右边的第二个按钮,并将高度设置为不同的值。然后使用最右边的第一个按钮重置该对象的框架。然后您会看到分段控件的高度已在Storyboard中调整。 - coolcool1994
这个实现的问题是,无论分段控件有多高,分段中的文本都不会换行为第二行或第三行,而是被截断。 - bibscy

84

是的,在代码中您可以使用[mySegmentedControl setFrame:frame]。不幸的是,您无法在IB中执行此操作。

因此,如果您只想更改高度:

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

8
只要在 viewDidLayoutSubviews 方法中执行(或者可能是更晚的时间点),而不是在 viewDidLoad 中执行,就可以在 IOS7 上正常运行。 - Thunk
3
无法在iOS 7.1上运行 - 我已经在viewDidLayoutSubviews和viewDidLoad中尝试过它。 - GangstaGraham
嘿...在iOS 7.1.1中工作,也可以在viewDidLoad中使用。如果您不想使用自动布局,则唯一的选择。 - Krzysztof Przygoda
它在iOS 7.1上无法工作。很高兴看到有解决方案。 - Vishal Sharma
优秀 - 任何可以帮助我避免设置约束的机制都是加分项。 - Nostradamus

27
添加一个新的高度约束并设置它的值。

在此输入图片描述


12
如果你正在使用自动布局并且在使用Luke's answer时遇到问题,这个方法对我非常有效:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:mySegmentedControl
                                     attribute:NSLayoutAttributeHeight 
                                     relatedBy:NSLayoutRelationEqual
                                     toItem:nil
                                     attribute:NSLayoutAttributeNotAnAttribute
                                     multiplier:1 
                                     constant:fNewHeight];
[mySegmentedControl addConstraint:constraint];

1
这个是唯一在iOS 7.1上对我有效的。非常棒的答案! - GangstaGraham

10
要在界面生成器中完成此操作,您可以选择控件,并在“用户定义的运行时属性”下添加框架属性。

在IB中添加框架属性


9

最好且简单的方法是将高度约束设置为分段控件,并根据需要增加其值。

enter image description here


这个实现的问题在于,无论分段控件有多高,分段中的文本都不会换行到第二行,而是会被截断。 - bibscy

7

Swift 3 IBInspectable解决方案:

@IBDesignable class MySegmentedControl: UISegmentedControl {

    @IBInspectable var height: CGFloat = 29 {
        didSet {
            let centerSave = center
            frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: height)
            center = centerSave
        }
    }
}

我创建了一个新的 Swift 文件并复制粘贴了你的代码。运行良好。谢谢。 - fozoglu

5

只需前往包含UisegmentContrrole的故事板并将高度约束设置为您自定义的高度

enter image description here


4

解决方案:

Swift
segmentedControl.frame = CGRect(x: segmentedControl.frame.origin.x, y: segmentedControl.frame.origin.y, width: segmentedControl.frame.size.width, height: 40);

将 SegmentedControl 的高度设置为 40。


4

幸运的是,你也可以从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


界面构建器显示了正确的新尺寸,但在运行时它会返回到默认尺寸。 - Hola Soy Edu Feliz Navidad

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