我试图以编程方式创建一个uiview并将其添加到stack_view中,该堆栈视图也是以编程方式创建并添加到视图中的。 这是代码:
.h
@interface ViewController : UIViewController
@property (strong, nonatomic, nullable) UIStackView * stack;
@end
.m
@implementation viewController
@synthesize stack;
- (void) viewDidLoad {
[super viewDidLoad];
CGRect * vframe = self.view.frame;
// - Option 1
stack = [[UIStackView alloc] initWithFrame:CGRectMake(vframe.origin.x, 100,vframe.size.width,300)];
stack.axis = UILayoutConstraintAxisHorizontal;
stack.aligment = UIStackViewAligmentTop;
stack.distribution = UIStackViewDistributionFill;
[self.vew addSubview:stack];
// Option 2
// stack.traslateAutorezisingMaskIntoConstraints = NO;
// [stack.leadingAnchor constraintsEqualToAnchor: self.view.leadingAnchor].active = YES;
// [stack.topAnchor constraintsEqualToAnchor: self.view.topAnchor constant: 100].active = YES;
UIView * pView = [[UIView alloc] init];
pView.backgroundColor = [UIColor blueColor];
[stack addArrangedSubview:pView];
}
@end
这段代码根本没有显示视图,我试图证明选项2(在代码中出现了注释)并且它也不起作用。在插入堆栈时,视图不应该得到堆栈的大小,因为它的分布是"填充"?。即使我用例如frame=CGRectMakeRect(0,0,self.view.frame.size.width,100)
定义Pview,这一切也都无效。
我做错了什么?
编辑:我已经修复了代码中的拼写错误(CGRect中的*和self.vew而不是self.view)。当我手动复制代码时,我犯了这些错误,我没有复制并粘贴代码;这就是为什么要制作它们以及原始代码编译好的原因
答案 0 :(得分:0)
CGRect vframe = self.view.frame;
在viewDidLoad
中,您的self.view.frame尚未计算。您需要在viewDidLayoutSubviews
或viewDidAppear
中执行此操作。这两个都会被多次调用,所以要小心。
修改强>:
正如下面danh所建议的那样(我忽略了它)你应该从上面的行中删除*,同样,你的代码中有几个拼写错误,不知道这些代码是如何为你编译的。
答案 1 :(得分:0)
要诊断第一次测试pView。使用CGRectMake(100,100,100,100)
这样的固定大小初始化,并将其直接添加到viewContoller's
视图中。如果你没有更深层次的问题,你应该能够看到没问题。
如果情况良好,请尝试使用固定大小的UIStackView
。如果需要,可以更好地查看背景。如果你仍然没有看到它,那么仔细检查它仍然在viewDidAppear
的{{1}}中有正确的框架。它可能在创建后自行调整。如果这是正确的,请在模拟器中将其放入Xcode后的viewController
Heirachy。如果您没有在那里看到它,那么将其添加为子视图时会出现问题(请注意拼写错误Debug -> View Debugging -> Capture View
;)
如果情况良好,那么[self.vew addSubview:stack]
就会出现问题。与上一步类似,循环遍历[stack addArrangedSubview:pView]
UIStackView
viewDidAppear
中所有已排列的视图。