web-dev-qa-db-ja.com

iOS:UISegmentedcontrolの高さを変更する

UISegmentedcontrolの高さを変更しようとしていますが、Interface Builderでは許可されていません。変更する方法はありますか、不可能ですか?

ありがとう

65
DavidNg

はい、コードで[mySegmentedControl setFrame:frame]を使用できます。 IBでこれができないのは残念です。

したがって、高さを変更するだけの場合:

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

IBに制約を追加することもトリックを行います。

Constraint in IB

145
Ji Fang

新しい高さ制約を追加し、その値を設定します。

enter image description here

24
naveed148

自動レイアウトを使用していて、 ルークの答え で問題が発生している場合、これは私にとって完璧に機能しました:

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

Interface Builder内でこれを行うには、コントロールを選択し、「ユーザー定義のランタイム属性」の下にフレーム属性を追加します。

add frame attribute inside IB

10
Shaz

最適かつ簡単な方法は、高さの制約をセグメント化されたコントロールに設定し、必要に応じてその値を増やすことです。

enter image description here

8
Arshad Shaik

Swift 3 IBInspectable Solution:

@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
        }
    }
}
7

幸いにも、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でも。

4
NiKKi

Storyboardに移動します。ここで、id UisegmentContrroleが配置され、height constraintが設定されています。カスタムheightsas

enter image description here

4
Rahul Panzade

迅速なソリューション:

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

segmentedControlの高さを40に設定します。

3
datayeah

迅速なソリューション:

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に設定します。

1
Anh Tuan

MySegmentedControl.frame = CGRectMake(15,5, 290, 50);を実行し、ビューに合わせて座標を変更するだけです(これはiOS 7用に更新されています)

0
Jacobanks

以下を試すことができます:

segmentedControll.addConstraint(
        NSLayoutConstraint(
            item: segmentedControll,
            attribute: NSLayoutAttribute.Height,
            relatedBy: NSLayoutRelation.Equal,
            toItem: nil,
            attribute: NSLayoutAttribute.NotAnAttribute,
            multiplier: 1,
            constant: 40.0
        )
    )
0
Duy linh Trần

Ji Fangの解決策はうまくいきませんでした。セグメント化されたコントロールをサブクラス化し、これらのメソッドを追加する必要がありました。自動レイアウトに基づくソリューションは、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

[自動レイアウトを使用]を選択した場合、フレームのリセットは機能しません。代わりに制約を変更する必要があります。おそらくそれは、Xcode 5でデフォルトで選択されているため、誰かにとってベストアンサーが機能しない理由です

0
ken zhou

私にとっての解決策は次のとおりでした-

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

自動リサイズを使用しなくても、すべてのバージョンで機能します。

0
iosDeveloper