【问题标题】:iOS Button Positioning for iPhone 5iPhone 5 的 iOS 按钮定位
【发布时间】:2013-01-12 05:35:04
【问题描述】:

我的应用由三个按钮组成,这些按钮是我以编程方式创建的,位于导航栏的正下方。我遇到的问题是,在模拟器中运行我的应用程序时,按钮非常适合 iphone 3.5",但是在新的更大屏幕尺寸上,它们的位置会下降一点。在我的代码中,我使用 self .view.frame.size.height-465 作为我的 y 坐标,因此无论屏幕大小如何,按钮都位于正确的位置。我也没有启用任何自动调整大小蒙版,因为我希望按钮位于当视图的大小发生变化时,位置相同。你们认为我做错了什么,因为每当我在 iphone 5 模拟器上运行我的程序时,按钮都会稍微向下移动。

编辑: 我现在附上两种屏幕尺寸的按钮屏幕截图,以便您知道我在说什么。


【问题讨论】:

  • 使用百分比而不是硬编码的像素值。
  • 你到底是什么意思?
  • self.view.frame.size.height-465
  • 是的,有 hard.coding,但 y 坐标不应该根据屏幕大小而变化吗?
  • @iProgrammed 我现在在原始帖子中添加了屏幕截图。

标签: ios objective-c uibutton uistoryboard iphone-5


【解决方案1】:

您不应该在代码中做任何事情。如果您将它放在导航栏的正下方,在 IB 中,它应该在任一屏幕尺寸中保持相同的距离(由于自动布局)。

编辑后:

如果您没有使用自动布局,而是在代码中执行所有操作,那么您应该从顶部设置 y 值,而不是高度 - 465。只需为 y 使用固定值。在下面的代码中,框架是在CustomButton的init方法中设置的,然后我只是改变它的位置:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CustomButton1 *button = [[CustomButton1 alloc] init];
    [button addTarget:self action:@selector(doStuff:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"test" forState:UIControlStateNormal];
    button.center = CGPointMake(self.view.center.x, 30);
    [self.view addSubview:button];
}

【讨论】:

  • 我没有使用自动布局,因为我需要向后兼容,而且我正在代码中生成按钮,IB 中什么都没有。
  • 嗯,如果您使用固定的 y 坐标,那么当尺寸发生变化时,iO 真正会发生什么变化。 self.view.center.x 返回一个点,对吗?
  • @DavidWest,不,self.view.center.x 返回一个 CGFloat(中心返回一个 CGPoint)。一个固定的 y 坐标,与顶部的距离始终相同,因为顶部的 y 坐标为 0,因此您将一个固定的数字添加到零 - 屏幕尺寸根本不考虑它。
【解决方案2】:
 CGSize screenSize = [[UIScreen mainScreen] bounds].size;

            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
                if (screenSize.height > 480.0f) {
                    /*Do iPhone 5 stuff here.*/

        myButton.frame = CGRectMake(0,0,129,412);
                } else {
                    /*Do iPhone Classic stuff here.*/ 

    myButton.frame = CGRectMake(0,0,123,412);
                }
            } else {
                /*Do iPad stuff here.*/
            }

【讨论】:

  • 等等,你什么意思?我已经有了通过 CGRectmake 创建的按钮,我的问题是位置
  • 嗯,这可行,但我正在寻找不需要这样做的解决方案。我真正关心的是 y 坐标定位。
  • 为什么不,如果您不打算使用自动布局,这是最好的方法。
  • 我已经在底部有按钮保持原位,我没有做任何与现在不同的事情。
【解决方案3】:

我强烈建议使用约束而不是框架。它会完全按照您的要求进行,并且会容易得多。您的代码可能类似于

[self.superViewOfButton addSubview:self.button1];
[self.superViewOfButton addSubview:self.button2];
[self.superViewOfButton addSubview:self.button3];

 NSDictionary *viewsDic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:self.button1, self.button2, self.button3, nil]
                                                      forKeys:[NSArray arrayWithObjects:@"button1", @"button2", @"button3", nil]];

[self.superViewOfButton      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[button1]"     options:0 metrics:0 views:viewsDic]];
[self.superViewOfButton      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[button1]"     options:0 metrics:0 views:viewsDic]];
[self.superViewOfButton      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[button2]"      options:0 metrics:0 views:viewsDic]];
[self.superViewOfButton      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[button2]"      options:0 metrics:0 views:viewsDic]];

这里是视觉语法语言的链接: http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html

记住将所有控件设置为

button1.translatesAutoresizingMaskIntoConstraints = NO;

一开始可能看起来有点多,但在阅读了大约 5 分钟后,它非常简单,并且使您的应用程序更加灵活。希望这会有所帮助。

【讨论】:

  • 我不能使用约束,因为我需要我的应用兼容 iOS5。
【解决方案4】:
  1. 定义这个

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

2.使用此代码

-(void)viewDidLoad  {
if( IS_IPHONE_5 )
   {
   int newY=(self.view.frame.size.height +( 568-480) )-465;
   [myButton setFrame:CGRectMake(0,newY,width,height);
   }  
else
   {
   int newY=(self.view.frame.size.height-465;
   [myButton setFrame:CGRectMake(0,newY,width,height);
   }


}

【讨论】:

  • 我的重点是这是必需的吗?在我的同一个应用程序中,底部的按钮可以正确定位,而无需任何此类代码。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2013-03-28
  • 2012-04-06
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多