4

背景:我想将我的内容的变化与方向一起动画化。我的内容位置是相对于self.view.bounds.

问题:为了使内容与边界一起动画,我需要知道视图的边界最终是什么。我可以对其进行硬编码,但我希望找到一种更动态的方式。

代码:所以所有动画都willRotateToInterfaceOrientation按照以下方式进行:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    //centering the image
    imageView.frame = CGRectMake(self.view.bounds.origin.x + (self.view.bounds.size.width - image.size.width)/2 , self.view.bounds.origin.y + (self.view.bounds.size.height - image.size.height)/2, image.size.width, image.size.height);
    NSLog(@"%d",[[UIDevice currentDevice] orientation]);
    NSLog(@"%f", self.view.bounds.origin.x);
    NSLog(@"%f", self.view.bounds.origin.y);
    NSLog(@"%f", self.view.bounds.size.width);
    NSLog(@"%f", self.view.bounds.size.height);

}

边界方向改变之前。因此,这仅在转换为 180 度时才有效。如果我要使用didRotateFromInterfaceOrientation,动画将在看起来很糟糕的方向更改之后。

4

3 回答 3

11

改为使用willAnimateRotationToInterfaceOrientation:duration:。从旋转动画块中调用此方法,此时所有边界都已正确设置。文档。

于 2012-05-02T19:52:39.517 回答
1

如果你希望它是动态的,那么当你初始化 imageView 时,设置autoresizingMask属性,以便当 imageView 的超级视图在旋转时调整大小时,边距可以自动调整大小......

 imageView = //init imageView
 imageView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
 //addtional config

这意味着您只需要设置一次框架,然后 imageView 将始终调整自身以保持在中间。

查看 UIView 类参考http://developer.apple.com/library/ios/ipad/#documentation/uikit/reference/uiview_class/uiview/uiview.html看看你还能用 autoresizingMask 属性做什么

于 2012-05-02T19:52:28.527 回答
0

如果我对您的理解正确,您只需要在您的 CGRectMake 中交换 X/Y 坐标和宽度/高度,以获得 90 度变化的未来布局。如果是180度变化,那么和现在一样

CGRectMake(self.view.bounds.origin.y + (self.view.bounds.size.height - image.size.height)/2 , self.view.bounds.origin.x + (self.view.bounds.size.width - image.size.width)/2, image.size.height, image.size.width);
于 2012-05-02T19:52:53.430 回答