更改方向IOS后视图边界不更新

Posted

技术标签:

【中文标题】更改方向IOS后视图边界不更新【英文标题】:View bounds dont update after changing orientation IOS 【发布时间】:2013-11-20 11:04:19 【问题描述】:

当我将方向更改为 viewController 时,我的应用程序出现问题。如果我以纵向模式(320 宽度)进入此视图控制器并更改为横向,那么似乎只有 320 宽度的横向模式处于活动状态,其余屏幕似乎已死。我试图在方向改变时更新 view.Frame 但它不起作用。谁能帮我这个?

- (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation
      if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
      
    // Portrait

        self.view.frame=CGRectMake(0,0,320,500);
        self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"smallerView2.png"]];

        self.thumbScrollView.frame = CGRectMake(20,100, 280, 72);

        self.rightThumbArrow.frame=CGRectMake(1,107, self.rightThumbArrow.bounds.size.width, self.rightThumbArrow.bounds.size.height);

        self.leftThumbArrow.frame=CGRectMake(self.view.bounds.size.width-30,107, self.leftThumbArrow.bounds.size.width, self.leftThumbArrow.bounds.size.height);

        self.bigImageView.frame=CGRectMake(20,200, 280, 200);

        self.previousPicBar.frame=CGRectMake(19,200, 10, 198);

        self.nextPicBar.frame=CGRectMake(291,200, 10, 198);

        self.leftArrowBtn.frame=CGRectMake(20,294, 8, 10);

        self.rightArrowBtn.frame=CGRectMake(292,294, 8, 10);





else

    // Landscape



        self.view.frame=CGRectMake(0, 0, 500, 320);

        NSLog(@"%f %f %f %f",self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height);

        self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"smallerView2Landscape.png"]];

        self.thumbScrollView.frame = CGRectMake(30,60, 520, 60);

        self.rightThumbArrow.frame=CGRectMake(10,65, self.rightThumbArrow.bounds.size.width, self.rightThumbArrow.bounds.size.height);

        self.leftThumbArrow.frame=CGRectMake(self.view.bounds.size.width-45,65, self.leftThumbArrow.bounds.size.width, self.leftThumbArrow.bounds.size.height);

        self.bigImageView.frame=CGRectMake(120,120, 350, 140);

        self.previousPicBar.frame=CGRectMake(119,122, 10, 136);

        self.nextPicBar.frame=CGRectMake(461,122, 10, 136);

        self.leftArrowBtn.frame=CGRectMake(120,180, 8, 10);

        self.rightArrowBtn.frame=CGRectMake(462,180, 8, 10);





- (void)viewWillAppear:(BOOL)animated
      [super viewWillAppear:animated];

      [self updateLayoutForNewOrientation:self.interfaceOrientation];
 

- (void)willAnimateRotationToInterfaceOrientation:  (UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
      [self updateLayoutForNewOrientation:self.interfaceOrientation];

【问题讨论】:

你是如何改变 view.frame 的?你能发布一些代码吗?你是用什么方法做到的? 我用一些代码编辑了我的问题。 【参考方案1】:

设置和获取视图坐标不匹配。您在 - (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation 中设置框架,并且在 NSLog 中您正在使用绑定进行打印。

获取宽度的正确方法如下

NSLog(@"x= %f y= %f w= %f h=%f",self.view.frame.origin.x,
self.view.frame.origin.y, self.view.frame.size.width,
self.view.frame.size.height);

你的代码

NSLog(@"%f %f %f %f",self.view.bounds.origin.x,
self.view.bounds.origin.y, self.view.bounds.size.width,
self.view.bounds.size.height);

使用框架更改绑定,反之亦然。

【讨论】:

我发布了处理方向的整个代码。没有其他细节。奇怪的是,当我打印 self.view 的宽度时,它给了我正确的宽度。虽然,当我打印触摸事件的坐标时,它只能达到 320 宽度,然后什么都不会打印。【参考方案2】:

回答我的用户是对的。我必须更改设置 x、y、宽度、高度的方式。

变化

self.view.frame=CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds
                                   .size.height);

self.view.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame
                                   .size.height);

并添加

[self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];

在 viewDidLoad 方法中有所作为。

【讨论】:

以上是关于更改方向IOS后视图边界不更新的主要内容,如果未能解决你的问题,请参考以下文章

当边界 UICollectionView 更改时调整单元格大小

ios 8 更改呈现/模态视图控制器的大小

UICollectionView 包装器视图框架更新

在 iOS 7 中,状态栏和导航栏出现在我的视图边界上

动画边界更改时具有 CALayer 有线效果的自定义视图

动画边界更改时具有 CALayer 有线效果的自定义视图