2017-02-03 78 views
0

我試圖以編程方式創建一個uview,並將其添加到編程方式創建並添加到視圖中的stack_view。 這是代碼:以編程方式添加uiview不顯示

的.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

要診斷此問題,首先測試pView。初始化它像一個固定的大小,如CGRectMake(100,100,100,100),並將其直接添加到viewContoller's視圖。如果不是你有更深的問題,你應該能夠看到它沒有問題。

如果順利的話,嘗試UIStackView與固定的大小。如果需要,可以將其背景着色爲更好看。如果你仍然沒有看到它,然後仔細檢查它仍然有viewControllerviewDidAppear正確的框架。它可能在創建後自行調整。如果這是正確的,請在模擬器中啓動Xcode後進入Debug -> View Debugging -> Capture View Heirachy。如果你沒有看到它,那麼有一個問題添加它作爲子視圖(注意錯字[self.vew addSubview:stack];)

如果這樣順利,那麼有一個[stack addArrangedSubview:pView]問題。與上一步類似,請在UIStackViewviewControllerviewDidAppear中循環所有已排列的子視圖。

+0

感謝您的回答安德魯麥金利,我做你的建議我,這些是我的發現:2)當我只測試與固定大小(CGRectMake(100,100,100,100))的pview並將其添加到self.view它的作品! b)當我只創建具有固定大小(CGRectMake(100,100,100,100))的堆棧視圖並將其添加到self.view時,它不起作用,並且我已經檢查過其大小爲100寬度和100高度在viewDidAppear中。您提到的錯字不在原始代碼中,我編輯該問題以修復該錯誤。你能給我吃什麼好嗎? – Airel

+0

@Airel你能在Capture View Heirachy中看到它嗎?在viewDidAppear它有一個superview,== self.view?請注意,我們不應該在此處添加pView。我們只是檢查是否UIStackView已經添加到viewController –

+0

我已經在Capture View Hierarchy中看到堆棧,並且它的superview是self.view。我將使用相同的方法來檢查Pview是否已正確添加到StackView的ArrangedSubviews數組中[stack addArrangedSubview:pView]; – Airel

0
CGRect vframe = self.view.frame; 

viewDidLoad,你self.view.frame尚未計算。您需要在viewDidLayoutSubviewsviewDidAppear中執行此操作。這些都會被多次調用,所以要小心。

編輯
正如danh(我忽略了它),你應該從上面的行刪除*,此外,你必須在你的代碼的幾個拼寫錯誤,不知道這個代碼真的怎麼連編譯如下建議您。

+1

將CGRect結構賦給CGRect *可能不會編譯。不知道它如何進入OP。 – danh

+0

@danh是的,你是對的,我一味地忽略它。另外,我注意到他現在有幾個拼寫錯誤:「[self.vew addSubview:stack];」在他的問題中,不知道如何爲他編譯的確如此。 – 2017-02-03 18:59:08

+0

感謝丹,我的壞...我已經編輯了這個問題,這些錯誤不是在原來的代碼...謝謝老兄 – Airel

相關問題