IOS: изменение высоты UISegmentedcontrol
Я пытаюсь изменить высоту 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)];
Ответ 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];
}