2015-05-20 48 views
1

有一個問題:我設置了一個名爲ZHLockView的自定義視圖。我把它放在故事板上,我設置了約束條件。但我無法在- (id)initWithCoder:(NSCoder *)aDecoder中得到正確的寬度,它總是320,我應該怎麼做才能獲得正確的寬度?iOS8 UIView寬度320

最後我知道在- (void)layoutSubviews,我可以得到正確的寬度,但它會走兩次。有更好的主意嗎?

+0

你所說的 「正確的寬度」 是什麼意思?你期望什麼寬度?你有什麼限制? – Caleb

+0

這個視圖還沒有在'initWithCoder:'中進行佈局,所以它只會有你在故事板中給出的框架。獲得正確寬度的最佳位置取決於您試圖用它做什麼。 – dan

+0

主要限制是寬度等於superView.width。我想在不同的設備中獲得正確的寬度 –

回答

0

看,你得到寬度爲320,因爲你的視圖在故事板上的大小。

如果視圖的寬度等於superview,這實際上又等於設備的寬度,那麼您可以使用以下代碼隨時獲取視圖寬度,而不必擔心在哪裏編寫。

斯威夫特: -

CGFloat width = CGRectGetWidth(UIScreen.mainScreen.bounds); 
CGFloat height = CGRectGetHeight(UIScreen.mainScreen.bounds); 

Objective-C的: -

CGFloat width = CGRectGetWidth([[UIScreen mainScreen] bounds]); 
CGFloat height = CGRectGetHeight([[UIScreen mainScreen] bounds]); 

希望你明白,它可以幫助你.. :)

+0

謝謝,我知道這一點。但是,如果superView的框架不是屏幕寬度? –

+0

然後,你想在代碼中實現什麼?請分享代碼。 – Tejvansh

+0

好吧,我在這裏找到了一個很好的答案..看看.. http://stackoverflow.com/questions/28501903/what-method-is-called-on-uiview-when-its-resized-by-autolayout Hope解決您的問題。讓我知道.. :) – Tejvansh

0

視圖將被負載在第一次啓動時xib中的值,接下來當自動佈局引擎進行第一次啓動時,它將被設置爲根據約束條件設置新的值。
爲什麼你需要知道尺寸? Autolayout是不關心它。
-layoutSubviews,-viewWillLayout,-viewDidLayout在佈局引擎需要更新時調用,這可能意味着在顯示視圖之前的不同時間。

+0

因爲在.m文件中,我使用了一些'for'語句,比約束條件更方便 –

+0

如果您使用autolayout,則必須手動更改幀,您應該只更改約束。即使它現在似乎正在工作,它應該在iOS – Andrea

0

的代碼是在這裏

objc

#define KScreenWidth [UIScreen mainScreen].bounds.size.width 
CGFloat height = 0; 
CGFloat margin = (KScreenWidth - columnCount * btnW)/(columnCount + 1); 
for (int i = 0; i < btnCount; i++) { 
    int row = i/columnCount; 
    int column = i % columnCount; 
    CGFloat btnX = margin + column * (btnW + margin); 
    CGFloat btnY = row * (btnW + margin); 
    height = btnH + btnY; 
    ZHButtonView *button = [[ZHButtonView alloc] initWithFrame:CGRectMake(btnX, btnY, btnW, btnH)]; 
    button.userInteractionEnabled = NO; 
    button.currentIndex = i; 
    [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal]; 
    [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected]; 
    [self addSubview:button]; 
} 
+0

的不同次要版本之間斷開好吧,您的代碼與視圖的框架沒有關係。我想你可以在viewDidLoad中調用它。它應該工作正常。 – Tejvansh