Я пытаюсь изменить высоту UISegmentedcontrol, но это не допускается в Interface Builder. Есть ли способ изменить или это невозможно?
Спасибо
Я пытаюсь изменить высоту UISegmentedcontrol, но это не допускается в Interface Builder. Есть ли способ изменить или это невозможно?
Спасибо
Да, вы можете использовать [mySegmentedControl setFrame:frame]
в коде. К сожалению, вы не можете сделать это в IB.
Итак, если вы просто хотите изменить высоту:
CGRect frame= mySegmentedControl.frame;
[mySegmentedControl setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, fNewHeight)];
Добавление ограничения в IB также сделает трюк:
Добавьте новое ограничение высоты и установите его значение.
Если вы используете автоматическую компоновку и возникают проблемы с Luke answer, это отлично сработало для меня:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:mySegmentedControl
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:fNewHeight];
[mySegmentedControl addConstraint:constraint];
Чтобы сделать это внутри Interface Builder, вы можете выбрать элемент управления и добавить фрейм в разделе "Атрибуты пользовательских атрибутов времени выполнения"
Лучший и простой способ - установить ограничение по высоте для сегментированного управления и увеличить его значение по мере необходимости.
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
}
}
}
К счастью, вы также можете изменить высоту с 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
.
Быстрое решение:
segmentedControl.frame = CGRect(x: segmentedControl.frame.origin.x, y: segmentedControl.frame.origin.y, width: segmentedControl.frame.size.width, height: 40);
устанавливает высоту сегмента SegmentedControl на 40.
Просто перейдите на раскадровку, где находится id UisegmentContrrole и установите ограничение высоты с вашими пользовательскими высотами, как
Быстрое решение:
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.
Просто сделайте MySegmentedControl.frame = CGRectMake(15,5, 290, 50);
и просто измените координаты, чтобы они соответствовали вашему представлению
(Это обновление для iOS 7)
Для меня решение было: -
CGRect frame = CGRectMake (20, 20, 180, 50);
self.segmentedControl.frame = frame;
Он работает в каждой версии и даже не использует авторезистор.
Если вы выберете "Использовать автоматический макет", кадр reset не работает, вместо этого вы должны изменить ограничения. Возможно, именно поэтому лучший ответ не работает для кого-то, потому что он выбран по умолчанию в xcode 5
Решение от Цзи Фан не работало для меня. Мне пришлось подклассифицировать сегментированный элемент управления и добавить эти методы. Решение, основанное на автоматической компоновке, не является надежным в 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);
}
Вы можете попробовать следующее:
segmentedControll.addConstraint(
NSLayoutConstraint(
item: segmentedControll,
attribute: NSLayoutAttribute.Height,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 40.0
)
)
- (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];
}