Подтвердить что ты не робот

IOS: изменение высоты UISegmentedcontrol

Я пытаюсь изменить высоту UISegmentedcontrol, но это не допускается в Interface Builder. Есть ли способ изменить или это невозможно?

Спасибо

4b9b3361

Ответ 1

Да, вы можете использовать [mySegmentedControl setFrame:frame] в коде. К сожалению, вы не можете сделать это в IB.

Итак, если вы просто хотите изменить высоту:

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

Ответ 2

Добавление ограничения в IB также сделает трюк:

Constraint in IB

Ответ 3

Добавьте новое ограничение высоты и установите его значение.

введите описание изображения здесь

Ответ 4

Если вы используете автоматическую компоновку и возникают проблемы с Luke answer, это отлично сработало для меня:

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

Ответ 5

Чтобы сделать это внутри Interface Builder, вы можете выбрать элемент управления и добавить фрейм в разделе "Атрибуты пользовательских атрибутов времени выполнения"

add frame attribute inside IB

Ответ 6

Лучший и простой способ - установить ограничение по высоте для сегментированного управления и увеличить его значение по мере необходимости.

введите описание изображения здесь

Ответ 7

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

Ответ 8

К счастью, вы также можете изменить высоту с 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.

Ответ 9

Быстрое решение:

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

устанавливает высоту сегмента SegmentedControl на 40.

Ответ 10

Просто перейдите на раскадровку, где находится id UisegmentContrrole и установите ограничение высоты с вашими пользовательскими высотами, как

enter image description here

Ответ 11

Быстрое решение:

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.

Ответ 12

Просто сделайте MySegmentedControl.frame = CGRectMake(15,5, 290, 50); и просто измените координаты, чтобы они соответствовали вашему представлению  (Это обновление для iOS 7)

Ответ 13

Для меня решение было: -

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

Он работает в каждой версии и даже не использует авторезистор.

Ответ 14

Если вы выберете "Использовать автоматический макет", кадр reset не работает, вместо этого вы должны изменить ограничения. Возможно, именно поэтому лучший ответ не работает для кого-то, потому что он выбран по умолчанию в xcode 5

Ответ 15

Решение от Цзи Фан не работало для меня. Мне пришлось подклассифицировать сегментированный элемент управления и добавить эти методы. Решение, основанное на автоматической компоновке, не является надежным в 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);
}

Ответ 16

Вы можете попробовать следующее:

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

Ответ 17

- (void)setTitle:(NSString *)title forSegmentAtIndex:(NSUInteger)segment {
[super setTitle:title forSegmentAtIndex:segment];
//正常展示 多行
[self setNeedsLayout];
for(UIView *subview in self.subviews) {
    if([NSStringFromClass(subview.class) isEqualToString:@"UISegment"]) {
        for(UIView *segmentSubview in subview.subviews) {
            if([NSStringFromClass(segmentSubview.class) isEqualToString:@"UISegmentLabel"]) {
                UILabel *label = (id)segmentSubview;
                label.numberOfLines = 2;
                CGRect frame = label.frame;
                frame.size = label.superview.frame.size;
                label.frame = frame;
            }
        }
    }
}
[self layoutIfNeeded];

}