Вместо кодирования всех ограничений вы можете использовать подкласс, который более простым способом обрабатывает .intrinsicContentSize
из UIView
. Это решение также немного улучшает Interface Builder в части поддержки представлений intrinsicWidth и intrinsicHeight. Хотя вы можете расширить UIView и сделать эти свойства доступными для всех UIView в IB, его очиститель будет подклассом.
// IntrinsicView.h
@import UIKit
IB_DESIGNABLE
@interface IntrinsicView : UIView
-(instancetype)initWithFrame:(CGRect)rect;
@property IBInspectable CGSize intrinsic;
@end
// IntrinsicView.m
#import "IntrinsicView.h"
@implementation IntrinsicView {
CGSize _intrinsic;
}
- (instancetype)initWithFrame:(CGRect)frame {
_intrinsic = frame.size;
if ( !(self = [super initWithFrame:frame]) ) return nil;
// your stuff here..
return self;
}
-(CGSize)intrinsicContentSize {
return _intrinsic;
}
-(void)prepareForInterfaceBuilder {
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, _intrinsic.width,_intrinsic.height);
}
@end
Это означает, что вы можете просто выделить эти IntrinsicView, и self.frame.size
будет приниматься как intrinsicContentSize
. Таким образом, это не нарушает нормальный макет, и вам не нужно устанавливать отношения ограничений, которые даже не применяются полностью с UIStackViews
#import "IntrinsicView.h"
- (void)viewDidLoad {
[super viewDidLoad];
UIStackView *column = [[UIStackView alloc] initWithFrame:self.view.frame];
column.spacing = 2;
column.alignment = UIStackViewAlignmentFill;
column.axis = UILayoutConstraintAxisVertical; //Up-Down
column.distribution = UIStackViewDistributionFillEqually;
for (int row=0; row<5; row++) {
//..frame:(CGRect) defines here proportions and
//relation to axis of StackView
IntrinsicView *intrinsicView = [[IntrinsicView alloc] initWithFrame:CGRectMake(0, 0, 30.0, 30.0)];
[column addArrangedSubview:intrinsicView];
}
[self.view addSubview:column];
}
теперь вы можете сойти с ума с помощью ![введите описание изображения здесь](https: //i.stack.imgur от UIStackView. com / hGfko.png )
или в swift + кодирование, декодирование, поддержка IB, поддержка Objective-C
@IBDesignable @objc class IntrinsicView : UIView {
@IBInspectable var intrinsic : CGSize
@objc override init(frame: CGRect) {
intrinsic = frame.size
super.init(frame: frame)
}
required init?(coder: NSCoder) {
intrinsic = coder.decodeCGSize(forKey: "intrinsic")
super.init(coder: coder)
}
override func encode(with coder: NSCoder) {
coder.encode(intrinsic, forKey: "intrinsic")
super.encode(with: coder)
}
override var intrinsicContentSize: CGSize {
return intrinsic
}
override func prepareForInterfaceBuilder() {
frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: intrinsic.width, height: intrinsic.height)
}
}
person
Ol Sen
schedule
31.07.2020
addArrangedSubview:
, а неaddSubview:
- person pkamb   schedule 01.12.2017