iOS:更改UISegmentedcontrol的高度


67

我正在尝试更改UISegmentedcontrol的高度,但是在界面生成器中不允许这样做。有什么办法可以改变还是不可能?

谢谢

Answers:


83

是的,您可以[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 2014年

3
在iOS 7.1上无法正常使用-我已经在Boath viewDidLayoutSubviews和viewDidLoad中进行了尝试
GangstaGraham 2014年

嘿...,可在iOS 7.1.1和viewDidLoad中使用。如果您不想使用自动布局,则是唯一的选择。
2014年

它在ios 7.1中不起作用。很高兴看到任何解决方案。
Vishal Sharma 2014年

147

在IB中添加约束也可以达到目的:

IB限制


你如何添加“蓝色”的限制
凡杜陈德良

1
在XIB中选择分段控件,编辑器-> Pin->高度
Ji Fang

适用于iOS8 +,但不适用于iOS7.0 +。在我的应用中,分段控件有时会将其高度更改为默认值28。返回CGSizeMake(defaultSize.width,35); }的高度为35(因此NSContentSizeLayoutConstraint的高度与NSLayoutConstraint相同),但控件有时仍会跳回默认高度28。
VladimírSlavík2014年

这是最好的答案。我在8.4和9.0上尝试过,它们都可以工作!非常感谢
Septronic 2015年

1
在情节提要板屏幕本身的正下方,w Any hNny旁边有4个底部。从右侧单击第二个,并将高度设置为其他值。然后使用右侧的第一个对象重置该对象的框架。然后,您会看到故事板中已调整分段控件的高度。
coolcool1994

25

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

在此处输入图片说明


12

如果您使用的是“自动版式”,并且在Luke的答案上遇到了麻烦,那么这对我来说非常合适:

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 2014年

10

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

在IB内添加框架属性


9

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

在此处输入图片说明


此实现的问题是,无论分段控件的高度有多高,分段中的文本都不会在第二行上显示。它将被截断。
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 17-02-27


4

幸运的是,你可以从改变高度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


界面生成器以正确的新大小显示它,但是在运行时会恢复为默认大小。
Hola Soy Edu Feliz Navidad

4

快速解决方案:

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

将SegmentedControl的高度设置为40。


2

快速解决方案:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    let rect = CGRect(origin: segment.frame.origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

要么

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let rect = CGRect(origin: segment.frame.origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

要么

    override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    let rect = CGRect(origin: segment.frame.origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

将SegmentedControl的高度设置为100。


0

只需MySegmentedControl.frame = CGRectMake(15,5, 290, 50);更改坐标即可使其适合您的视图(iOS 7已更新)


0

纪芳的解决方案对我不起作用。我必须对分段控件进行子类化并添加这些方法。基于自动布局的解决方案在iOS7.0 /7.1中不可靠。有时它会跳回默认高度。

const static CGFloat kViewHeight = 35;

- (void) layoutSubviews {

    [super layoutSubviews];

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

}

- (CGSize) intrinsicContentSize {

    CGSize defaultSize = [super intrinsicContentSize];
    return CGSizeMake(defaultSize.width, kViewHeight);
}

0

您可以尝试以下方法:

segmentedControll.addConstraint(
        NSLayoutConstraint(
            item: segmentedControll,
            attribute: NSLayoutAttribute.Height,
            relatedBy: NSLayoutRelation.Equal,
            toItem: nil,
            attribute: NSLayoutAttribute.NotAnAttribute,
            multiplier: 1,
            constant: 40.0
        )
    )

通常不建议在StackOverflow上进行代码转储。对代码正在执行的操作进行一些解释不会出错。
rayryeng 2015年

0

如果选择“使用自动布局”,则重置框不起作用,而应更改约束。也许这就是为什么最佳答案对某人不起作用的原因,因为它在xcode 5中是默认选择的


-1

对我来说解决方案是:-

CGRect frame = CGRectMake (20, 20, 180, 50);
self.segmentedControl.frame = frame;

它适用于所有版本,甚至无需使用自动调整大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.