在视图旋转时移动对象

时间:2011-07-08 13:48:39

标签: ios rotation orientation cgrect

我有一个iPad应用程序,我想侧向工作,而不仅仅是肖像。我以编程方式将图像,标签和按钮放入我的视图中,并使用CGRectMake(x,x,x,x)告诉他们将视图放到中心的哪个位置。当应用程序水平旋转时,我需要我的标签和按钮向上移动(因为它们在横向模式下不能向下移动),但保持在中心位置。这是我一直在玩的一些代码:

if((self.interfaceOrientation == UIDeviceOrientationLandscapeLeft) || (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)) 
{
    lblDate = [[UILabel  alloc] initWithFrame:CGRectMake(384-(fieldWidth/2)-30,controlTop+45,120,40)]; //these dimensions aren't correct, though they don't matter here

    lblDate.text = @"Date:";
    lblDate.backgroundColor = [UIColor clearColor];
    [contentView addSubview:lblDate];
} else {
    //the orientation must be portrait or portrait upside down, so put duplicate the above code and change the pixel dimensions
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

看看这个:iphone/ipad orientation handling

您只需根据旋转指定每个控制位置。

答案 1 :(得分:0)

我知道这可能是一个旧问题,现在正在考虑约会,但我最近才遇到同样的问题。您可能偶然发现许多建议,例如转换主视图的子视图或它的图层。这不适用于我。

实际上,我发现的单独解决方案是,由于您希望动态定位UI控件,因此不要将它们主要部署在界面构建器中。界面构建器可以帮助您了解纵向和横向方向上动态控件的所需位置。即在界面构建器中创建两个单独的测试视图,一个纵向和另一个横向,根据需要对齐控件,然后向下对齐X,Y,Width和Height数据,以便与每个控件的CGRectMake一起使用。

只要您从界面构建器中记下所有需要的定位数据,就可以删除那些已经绘制的控件和出口/操作链接。他们现在没有必要了。

当然不要忘记实现UIViewController的willRotateToInterfaceOrientation来设置每个方向更改的控件框架。

@interface

//Declare your UI control as a property of class.
@property (strong, nonatomic) UITableView *myTable;

@end

@implementation

// Synthesise it
@synthesize myTable

- (void)viewDidLoad
{
    [super viewDidLoad];

// Check to init for current orientation, don't use [UIDevice currentDevice].orientation
  if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        myTable = [[UITableView alloc] initWithFrame:CGRectMake(20, 20, 228, 312)];
    }
    else if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        myTable = [[UITableView alloc] initWithFrame:CGRectMake(78, 801, 307, 183)];
    }
}

    myTable.delegate = self;
    myTable.dataSource = self;

    [self.view addSubview:myTable];
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
    {
        // Show landscape
        myTable.frame = CGRectMake(20, 20, 228, 312);

    }
    else
    {
        // Show portrait
        myTable.frame = CGRectMake(78, 801, 307, 183);
    }
}