iOS:改变 UISegmentedcontrol 的高度

Posted

技术标签:

【中文标题】iOS:改变 UISegmentedcontrol 的高度【英文标题】:iOS: change the height of UISegmentedcontrol 【发布时间】:2012-08-15 04:33:29 【问题描述】:

我正在尝试更改 UISegmentedcontrol 的高度,但在 Interface Builder 中是不允许的。有什么办法可以改变还是不可能?

谢谢

【问题讨论】:

【参考方案1】:

是的,您可以在代码中使用[mySegmentedControl setFrame:frame]。很遗憾,你不能在 IB 中做到这一点。

所以,如果你只是想改变高度:

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

【讨论】:

只要你在 viewDidLayoutSubviews(或者,大概,以后)而不是 viewDidLoad 中做,在 ios7 中就可以正常工作。 无法在 iOS 7.1 上运行 - 我已经在船 viewDidLayoutSubviews 和 viewDidLoad 中尝试过 嘿...,适用于 iOS 7.1.1 和 viewDidLoad。如果您不想使用自动布局,这是唯一的选择。 它在 ios 7.1 中不起作用。很高兴看到任何解决方案。【参考方案2】:

如果您使用自动布局并且在使用 Luke's answer 时遇到问题,这对我来说非常有效:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:mySegmentedControl
                                     attribute:NSLayoutAttributeHeight 
                                     relatedBy:NSLayoutRelationEqual
                                     toItem:nil
                                     attribute:NSLayoutAttributeNotAnAttribute
                                     multiplier:1 
                                     constant:fNewHeight];
[mySegmentedControl addConstraint:constraint];

【讨论】:

这是唯一一个在 iOS 7.1 中对我有用的。很棒的答案!【参考方案3】:

在 IB 中添加约束也可以解决问题:

【讨论】:

如何添加“蓝色”约束 选择XIB中的Segmented Control,Editor->Pin->height 适用于 iOS8+ 但不适用于 iOS7.0+。在我的应用程序中,分段控件有时会将其高度更改回默认值 28。我还实现了 - (CGSize) intrinsicContentSize CGSize defaultSize = [super intrinsicContentSize];返回 CGSizeMake(defaultSize.width, 35); 高度为 35(因此高度的 NSContentSizeLayoutConstraint 与 NSLayoutConstraint 相同),但控件有时仍会跳回默认高度 28。 这是最好的答案。我在 8.4 和 9.0 上尝试过,它们都有效!非常感谢 故事板屏幕本身的正下方,在 w Any hAny 旁边,有 4 个底部。单击右侧的第二个并将高度设置为不同的值。然后使用右侧的第一个对象重置该对象的帧。然后您会在 Storyboard 中看到分段控件的高度已调整。【参考方案4】:

只需执行MySegmentedControl.frame = CGRectMake(15,5, 290, 50); 并更改坐标以适合您的视图 (这是为 iOS 7 更新的)

【讨论】:

【参考方案5】:

对我来说,解决方案是:-

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

它适用于每个版本,甚至不使用自动调整大小。

【讨论】:

【参考方案6】:

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

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

【讨论】:

界面生成器以正确的新大小显示它,但它在运行时恢复为默认大小。【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

纪方的解决方案对我不起作用。我必须对分段控件进行子类化并添加这些方法。基于自动布局的解决方案在 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);

【讨论】:

【参考方案10】:

快速解决方案:

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

将 SegmentedControl 的高度设置为 40。

【讨论】:

【参考方案11】:

您可以尝试以下方法:

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

【讨论】:

在 *** 上通常不鼓励代码转储。代码所做的事情背后的一些解释不会出错。【参考方案12】:

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

【讨论】:

【参考方案13】:

快速解决方案:

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。

【讨论】:

【参考方案14】:

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

【讨论】:

这种实现的问题是,无论分段控件多高,分段中的文本都不会走第二行。它将被截断。【参考方案15】:

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 文件并复制粘贴您的代码。工作得很好。谢谢【参考方案16】:

只需转到 id UisegmentContrrole 所在的 Storyboard 并将 height constraint 设置为您的自定义 heights

【讨论】:

以上是关于iOS:改变 UISegmentedcontrol 的高度的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的圆角半径?

ios UISegmentedControl的定制

iOS学习七之UISegmentedControl

iOS - 这是由 UISegmentedControl 控制的 UIPageViewController,还是这是啥?

ios UISegmentedControl的使用简介

升级到 iOS 6 后 UISegmentedControl 的显示问题