ios - Xcode UIView 随机调整大小

标签 ios xcode swift uiview

我正在为 iPhone 开发一款游戏,但在动态生成的关卡屏幕上遇到了问题。我有一个 ScrollView ,其中包含一堆关卡包按钮,这些按钮被添加到我的 View Controller 的主视图中。我将 ScrollView 设置为屏幕的宽度,一切都很好。

当我运行该应用程序时,一切正常。然而,在 1-30 秒后, ScrollView 会神奇地决定将其宽度减半,我完全不知道为什么。

我尝试覆盖 viewDidLayoutSubviews 并对宽度进行硬编码,但这不起作用。另外,当我运行该应用程序时,我实际上什么也没做。我什至不触摸手机本身, ScrollView 会改变大小,所以我不知道什么可能首先触发 ScrollView 改变大小。

以前有人听说过或遇到过这个错误吗?如果是这样,你知道如何解决吗?

提前致谢。

最佳答案

这是声明:

它具有自定义字体,因此只需忽略自定义字体,它还有可适应所有 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]];

你看,内容 View 与scrollView的内容 View 大小相同,这里的最佳点是宏调整器,即使你基本上将高度和宽度以及垂直和高度约束声明为常量,它也会使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

另外,没有必要摆弄布局 subview 或类似的东西,您可以在 ViewDidLoad 或子类的默认初始值设定项中声明和设置所有这些,您实际上不必考虑它除此之外,您还可以为内容 View 中设置的约束设置动画。

另一种方法是,如果您在没有内容 View 的情况下设置 UIScrollView,那么您必须使用硬编码的 WIDTH 值显式声明所有水平约束,以使其永远不会收缩,请参阅以下内容:

_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]];

上面有很多 subview ,但你真正想看的是这个:

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

其中我在约束中显式声明 ScrollView 的水平宽度,只要 spacerLine1 存在于其 subview 中,这就会保留整个 ScrollView 宽度

另外,上面的两种方法都使用了苹果技术说明中的两种方法,我更喜欢第二种方法,但是第一种方法对于复杂的动画是必要的,因为 ScrollView 将充当contentView 的 subview 可以被约束/更新/动画等等。另外,当我说你不需要搞乱layoutSubviews 时,我的意思是你不必使用它来渲染 ScrollView ,但如果您计划对内容 View 的 subview 的约束进行动画处理,您显然仍然需要调用layoutIfNeeded。

关于ios - Xcode UIView 随机调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027421/

相关文章:

ios - UITextField 自定义如何选择或插入文本

ios - Google Places API 图片请求网址不返回图片

ios - 单击 iboutlet 旁边的圆圈会创建断点,而不是显示 Storyboard链接

ios - 我怎么知道这个特定函数在哪里被调用?

ios - 带有单例的 AVCaptureSession。如何管理?

c# - Xamarin.IOS 日期格式

ios - 生成具有给定分布的随机数

iphone - UIToolBar 选中按钮状态

ios - 如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?

swift - SpriteKit - 为整个场景添加模糊