iOS 以编程方式居中对象
Posted
技术标签:
【中文标题】iOS 以编程方式居中对象【英文标题】:iOS Programmatically Center Objects 【发布时间】:2015-03-09 03:39:55 【问题描述】:我正在更新一个应用程序以支持 iPhone 6 Plus。在以编程方式设置的视图之一上,在 5S 或以下运行时,所有视图都以应有的方式居中。但是,在 6 Plus 上,它略微向左移动。如何调整此代码以使其在所有版本中水平居中?
[self.logInView.usernameField setFrame:CGRectMake(35.0f, 125.0f, 250.0f, 50.0f)];
[self.logInView.passwordField setFrame:CGRectMake(35.0f, 175.0f, 250.0f, 50.0f)];
[self.fieldsBackground setFrame:CGRectMake(35.0f, 125.0f, 250.0f, 100.0f)];
[self.logInView.logInButton setFrame:CGRectMake(35.0f, 235.0f, 250.0f, 40.0f)];
【问题讨论】:
框架坐标(x 和 y)基于父视图的框架,而不是硬编码值。 您可能希望在 viewDidLayoutSubviews 中设置中心。至此你就知道了父母的真实框架。 【参考方案1】:您可以使用“边界”和“中心”:
self.logInView.usernameField.bounds = CGRectMake(0,0,250,50);
self.logInView.usernameField.center = CGPointMake(160, 150);
【讨论】:
但这如何确保视图以不同的设备为中心?你不能只硬编码坐标。 只需使用 [UIScreen mainScreen] bounds].size.height / 2 和 [UIScreen mainScreen] bounds].size.width / 2 根据屏幕大小将其居中。【参考方案2】:答案很简单……使用自动布局。但如果你不知道如何使用它,试试这个:
首先,创建一些定义:
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPADDEVICE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_IPAD (IS_IPADDEVICE && [[UIScreen mainScreen] bounds].size.height == 1024.0)
然后创建一个简单的 if 语句:
if (IS_IPHONE_4)
// iPhone 4
else if (IS_IPHONE_5)
// iPhone 5
else if (IS_IPHONE_6)
// iPhone 6
else if (IS_IPHONE_6_PLUS)
// iPhone 6 plus
else if (IS_IPAD)
// iPad
else
// other device
如果我想使一个对象居中,我使用frame
方法:
theobject.frame = CGRectMake((theobject.frame.size.width/2) - (theobject.image.size.width/2), 20, theobject.image.size.width, theobject.image.size.height);
希望这个回答对你有帮助! ;)
【讨论】:
我尝试过,我收到很多错误,说“未声明使用 IS_IPHONE_4”等。 即使没有自动布局,也没有理由使用所有设备宏。并且您答案中的最后一行代码应该基于父视图的框架。 您是否在导入下创建了定义:cl.ly/image/2L3B3I1b3s13 ??? 我也在帮忙。请解释所有宏的用途以及if-else
大块的用途。您的答案中唯一相关的部分是最后一行,但该代码无法按原样工作。【参考方案3】:
[self.logInView.usernameField setFrame:CGRectMake(self.view.center.x - 125, 0, 250.0f, 50.0f);];
[self.logInView.passwordField setFrame:CGRectMake(self.view.center.x - 125, 175.0f, 250.0f, 50.0f)];
[self.fieldsBackground setFrame:CGRectMake(self.view.center.x - 125, 125.0f, 250.0f, 100.0f)];
[self.logInView.logInButton setFrame:CGRectMake(self.view.center.x - 125, 235.0f, 250.0f, 40.0f)];
您可以使用此代码在所有 ios 设备上很好地放置 UI。
【讨论】:
【参考方案4】:您似乎正在更新您的Parse loginView。我遇到了同样的问题……让默认的 loginView 适合所有屏幕设备尺寸真的很痛苦。我将分享一些希望对您有所帮助的代码。这应该在 Parse 的 IOS Helper Page 上。 将其放入您的 .m 文件中
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
//Returns the screen dimensions (in points) of the user's current device
CGRect screenBounds = [[UIScreen mainScreen] bounds];
//Finds to see if the user has an iPhone 4s, and then set's the layout if they do
if(screenBounds.size.height==480)
[self.logInView.logInButton setFrame:CGRectMake(self.view.center.x - 125, 300.0f, 250.0f, 50.0f)];
[self.logInView.usernameField setFrame:CGRectMake(self.view.center.x - 125, 165.0f, 250.0f, 50.0f)];
[self.logInView.passwordField setFrame:CGRectMake(self.view.center.x - 125, 215.0f, 250.0f, 50.0f)];
[self.logInView.passwordForgottenButton setFrame:CGRectMake(self.view.center.x - 125, 265.0f, 250.0f, 40.0f)];
//Finds to see if the user has an iPhone 5/5s, and then set's the layout if they do
else if (screenBounds.size.height == 568)
[self.logInView.logInButton setFrame:CGRectMake(self.view.center.x - 125,360.0f, 250.0f, 50.0f)];
[self.logInView.usernameField setFrame:CGRectMake(self.view.center.x - 125, 245.0f, 250.0f, 50.0f)];
[self.logInView.passwordField setFrame:CGRectMake(self.view.center.x - 125, 295.0f, 250.0f, 50.0f)];
[self.logInView.passwordForgottenButton setFrame:CGRectMake(self.view.center.x - 125, 445.0f, 250.0f, 40.0f)];
//If the user doesn't have a 4S/5/5s, then they must be using an iPhone 6/6+
else
[self.logInView.logInButton setFrame:CGRectMake(self.view.center.x - 125, 420.0f, 250.0f, 50.0f)];
[self.logInView.usernameField setFrame:CGRectMake(self.view.center.x - 125, 275.0f, 250.0f, 50.0f)];
[self.logInView.passwordField setFrame:CGRectMake(self.view.center.x - 125, 325.0f, 250.0f, 50.0f)];
[self.logInView.passwordForgottenButton setFrame:CGRectMake(self.view.center.x - 125, 485.0f, 250.0f, 40.0f)];
//Prints out the current device being used
NSLog(@"Current device: %@", [[UIDevice currentDevice] model] );
【讨论】:
以上是关于iOS 以编程方式居中对象的主要内容,如果未能解决你的问题,请参考以下文章