2015-08-15 108 views
0

我正在開發一款iPhone手機遊戲,並且遇到了動態生成的關卡屏幕問題。我有一個滾動視圖,其中包含一堆級別包按鈕,它們被添加到我的視圖控制器的主視圖。我使scrollview成爲屏幕的寬度,並且一切都很好,很棒。Xcode UIView隨機調整大小

當我運行應用程序時,一切正常。但是,在1-30秒之後,scrollview將會奇蹟般地決定將其寬度減半,我完全不知道爲什麼。

我試過覆蓋viewDidLayoutSubviews,並在那裏硬編碼寬度,但這不起作用。另外,當我運行該應用程序時,我從字面上看沒有任何問題。我甚至不會觸摸手機本身,並且滾動視圖會改變大小,所以我不知道什麼可能觸發scrollview來首先改變大小。

有沒有人甚至聽說過或有過這個bug?如果是這樣,你知道如何解決它嗎?

在此先感謝。

+0

你使用自動佈局約束?當我的意思是使用它們時,你是否全力以赴使用它們?如果是這樣,我有這個問題,並解決了它,但我需要知道是否/如何限制滾動視圖 – Loxx

+0

我正在編程生成一切。我使用故事板的唯一的東西就是segues。 – Aderis

+0

完美無瑕,就像一位老闆,你正通過互聯網連接高級程序視圖,無論如何,請先閱讀本文,看看它是否有幫助:https://developer.apple.com/library/ios/technotes/tn2154/_index。 HTML我告訴你先使用它,因爲我的方式可能不適合你,而且你更容易排除蘋果破碎的UIScrollView可以做的和不能做的事情。使用自動佈局或混合自動佈局進行復雜視圖編程時,UIScrollView幾乎不可用。如果這不起作用,我會告訴你如何重新創建問題,實施蘋果的修復和我自己的修復 – Loxx

回答

0

這裏的聲明:

這有自定義字體,所以就忽略自定義字體,還具有自定義調整功能,彎曲到所有的iphone尺寸宏和自定義顏色,忽略那些還有:

_scrollPlaceholder = [UIScrollView new]; 
[_scrollPlaceholder setDelegate:self]; 
[_scrollPlaceholder setShowsHorizontalScrollIndicator:FALSE]; 
[_scrollPlaceholder setPagingEnabled:false]; 
[_scrollPlaceholder setBackgroundColor:NSHMasterLightBlueColor]; 
[_scrollPlaceholder setFrame:CGRectMake(0, heightResizer(50)+heightForNSHNavBar, SCREEN_WIDTH, heightResizer(50))]; 
[_scrollPlaceholder setContentSize:CGSizeMake(SCREEN_WIDTH*3, heightResizer(50))]; 
[_scrollPlaceholder setScrollEnabled:true]; 
[_scrollPlaceholder setKeyboardDismissMode:UIScrollViewKeyboardDismissModeInteractive || UIScrollViewKeyboardDismissModeOnDrag]; 
[_scrollPlaceholder setBounces:false]; 
[_scrollPlaceholder setDirectionalLockEnabled:true]; 
[self addSubview:_scrollPlaceholder]; 

UIView *contentView; 
contentView = [[UIView alloc] initWithFrame:CGRectMake(0,0,SCREEN_WIDTH*2.2, heightResizer(50))]; 
[_scrollPlaceholder addSubview:contentView]; 
[_scrollPlaceholder setContentSize:CGSizeMake(SCREEN_WIDTH*2.2, heightResizer(50))]; 

這裏的約束上:

NSDictionary * views = NSDictionaryOfVariableBindings(_searchOption1, _searchOption2, _searchOption3, _searchOption4, _searchOption6, _searchOption7, sp1, sp2, sp3,sp4,sp6,sp7,sp8); 
NSDictionary * metrics = @{@"sp" : @10, @"spd" : @(heightResizer(40)), @"this" : @(widthResizer(157.0))}; 

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[sp1(>=0)]-[_searchOption1]-[sp2(==sp1)]-[_searchOption2]-[sp3(==sp1)]-[_searchOption3]-[sp4(==sp1)]-[_searchOption4]-[sp6(==sp1)]-[_searchOption6]-[sp7(==sp1)]-[_searchOption7]-[sp8(==sp1)]-|" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption1(spd)]" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption2(spd)]" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption3(spd)]" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption4(spd)]" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption6(spd)]" options:0 metrics:metrics views:views]]; 
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_searchOption7(spd)]" options:0 metrics:metrics views:views]]; 

你看,內容畫面的大小與滾動視圖的內容取景,這裏的甜點是宏觀調節大小是即使您基本上將高度和寬度以及垂直和高度約束聲明爲常量,也可以使srollview在自動佈局中彈性化。

宏,好措施:

#define SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) 

#define SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) 

#define hi(n) n/736.00 //<=== set to largest iphone screen height = iphone 6+ 
#define his(n) n/414.00 //<=== set to largest iphone screen width = iphone 6+ 

#define heightResizer(n) hi(n)*SCREEN_HEIGHT 
#define widthResizer(n) his(n)*SCREEN_WIDTH 

此外,還有一點,沒有必要反覆折騰佈局子視圖或類似的東西,你最多可以在viewDidLoad中或在聲明和設置所有的這子類的默認初始化程序,您並不需要太多考慮,也可以爲在內容視圖中設置的約束設置動畫。

另一種方法是,如果你設置了沒有內容視圖的UIScrollView,那麼你將不得不用明確的方式聲明所有的水平約束,以便它永不收縮,參見下面的內容:

_redBackGround = [UIScrollView new]; 
[_redBackGround setDelegate:self]; 
[_redBackGround setShowsHorizontalScrollIndicator:FALSE]; 
[_redBackGround setBackgroundColor:[UIColor whiteColor]]; 
[_redBackGround setTranslatesAutoresizingMaskIntoConstraints:FALSE]; 
[_redBackGround setScrollEnabled:true]; 
[_redBackGround setDirectionalLockEnabled:YES]; 
[_redBackGround setFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; 
[_redBackGround setKeyboardDismissMode:UIScrollViewKeyboardDismissModeInteractive || UIScrollViewKeyboardDismissModeOnDrag]; 
[self addSubview:_redBackGround]; 

views = NSDictionaryOfVariableBindings(aboutDivider, notificationsDividier, _emailSettingsControl, _passwordSettingsControl, _phoneNumberSettingsControl, _privacyPolicyLinker, _versionNumber, _systemInfoLinker, _userStatsLinker, _contactUsLinker, _termsOfUserLinker, spacerLine1, spacerLine2, spacerLine3, spacerLine4, spacerLine5, spacerLine6, spacerLine7, spacerLine8, spacerLine9, spacerLine10, spacerLine11, _collectionSettings, _messageSettings, _commentSettings, _likesSettings, spacerLinea11, commentsSettingsLabel, collectionsSettingsLabel, messageSettingsLabel, likeSettingsLabel, _zipCodeControl, _zipCodeControl, _catchyMotoControl, spacerLinea12, spacerLinea13, phoneNumberLabel, passwordLabel, emailLabel, zipCodeLabel, catchyLabelControl); 

metrics = @{@"bi" : @(widthResizer(5.0)), @"bh" : @(widthResizer(15.0)), @"sbh" : @(widthResizer(2.0)), @"aw" : @50, @"ah" : @50, @"sp" : @3, @"spd" : @(widthResizer(15.0)), @"sps" : @Spacer, @"fo": @(heightResizer(44.0)), @"smo": @(widthResizer(88.0)), @"fok": @(heightResizer(44.00)), @"spa" : @(widthResizer(20.0)), @"u" : @(widthResizer(404.0)), @"uss" : @(heightResizer(20.0))}; 

[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine1(u)]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine2]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine3]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine4]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine5]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine6]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine7]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine8]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine9]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine10]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine11]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLinea11]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLinea12]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLinea13]-bi-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[catchyLabelControl]-sbh-[_catchyMotoControl]-sbh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[zipCodeLabel]-sbh-[_zipCodeControl]-sbh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[phoneNumberLabel]-sbh-[_phoneNumberSettingsControl]-sbh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[passwordLabel]-sbh-[_passwordSettingsControl]-sbh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[emailLabel]-sbh-[_emailSettingsControl]-sbh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[notificationsDividier]|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[likeSettingsLabel][_likesSettings(smo)]-bh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[commentsSettingsLabel][_commentSettings(smo)]-bh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[messageSettingsLabel][_messageSettings(smo)]-bh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-spa-[collectionsSettingsLabel][_collectionSettings(smo)]-bh-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aboutDivider]|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_privacyPolicyLinker]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_versionNumber]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_systemInfoLinker]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_userStatsLinker]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_contactUsLinker]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_termsOfUserLinker]-spd-|" options:0 metrics:metrics views:views]]; 
[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-uss-[_phoneNumberSettingsControl(fok)]-sp-[spacerLine1(sps)]-sp-[_passwordSettingsControl(fok)]-sp-[spacerLine2(sps)]-sp-[_emailSettingsControl(fok)]-sp-[spacerLinea13(sps)]-sp-[_zipCodeControl(fok)]-sp-[spacerLinea12(sps)]-sp-[_catchyMotoControl(fok)]-sp-[notificationsDividier(20)]-sp-[_likesSettings(fo)]-sp-[spacerLine9(sps)]-sp-[_commentSettings(fo)]-sp-[spacerLine10(sps)]-sp-[_messageSettings(fo)]-sp-[spacerLine11(sps)]-sp-[_collectionSettings(fo)]-sp-[aboutDivider(20)]-sp-[_privacyPolicyLinker(fok)]-sp-[spacerLine4(sps)]-sp-[_versionNumber(fok)]-sp-[spacerLine5(sps)]-sp-[_systemInfoLinker(fok)]-sp-[spacerLine6(sps)]-sp-[_userStatsLinker(fok)]-sp-[spacerLine7(sps)]-sp-[_contactUsLinker(fok)]-sp-[spacerLine8(sps)]-sp-[_termsOfUserLinker(fok)]-sp-[spacerLinea11(sps)]-sp-|" options:0 metrics:metrics views:views]]; 

[_redBackGround addConstraint:[NSLayoutConstraint 
           constraintWithItem:passwordLabel 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:_passwordSettingsControl 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1 
           constant:0]]; 

[_redBackGround addConstraint:[NSLayoutConstraint 
           constraintWithItem:emailLabel 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:_emailSettingsControl 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1 
           constant:0]]; 

[_redBackGround addConstraint:[NSLayoutConstraint 
           constraintWithItem:phoneNumberLabel 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:_phoneNumberSettingsControl 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1 
           constant:0]]; 

[_redBackGround addConstraint:[NSLayoutConstraint 
           constraintWithItem:zipCodeLabel 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:_zipCodeControl 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1 
           constant:0]]; 

[_redBackGround addConstraint:[NSLayoutConstraint 
           constraintWithItem:catchyLabelControl 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:_catchyMotoControl 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1 
           constant:0]]; 

上面有很多在它的子視圖,但你真的想看看一個是這一個:

[_redBackGround addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-bi-[spacerLine1(u)]-bi-|" options:0 metrics:metrics views:views]]; 

,我明確地聲明滾動視圖的水平寬度的限制這保留了整個滾動條日lViews寬度只要spacerLine1存在於它的子視圖

此外,還有一兩件事,這兩個方法的上述使用蘋果公司的技術說明這兩種方法,我往往喜歡第二種方法比較好,但首先是需要對複雜動畫,因爲scrollview將作爲contentView的一個調色板,其子視圖可以被約束/更新/動畫等等。另外,當我說你不需要混淆layoutSubviews時,我的意思是你不需要使用它來渲染scrollView,但是如果你打算在動畫中使用,你顯然還是需要調用layoutIfNeeded內容視圖的子視圖的約束。

+0

將所有內容添加到單個視圖,並將該視圖添加到滾動視圖不起作用,但感謝您的幫助。 – Aderis

+0

沒有問題,對此表示遺憾 – Loxx

+0

在另一個筆記上,您會推薦何處去了解約束條件?我不知道他們是如何工作的,或者如何以編程方式實現它們(或者甚至是他們爲此所做的大部分工作)。 – Aderis