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 以编程方式居中对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式将 UILabel 对象居中?

在 iOS 8 中以编程方式将视图中的按钮居中使用约束

以编程方式自动布局不垂直居中

以编程方式使用约束使 UIIMageView 居中

以编程方式在 ImageView 上居中 TextView

在其线性布局垂直父Android中将以编程方式创建的单选按钮居中