iphone的旋转视图不占用整个屏幕

Posted

技术标签:

【中文标题】iphone的旋转视图不占用整个屏幕【英文标题】:iphone's rotated view doesn't take up whole screen 【发布时间】:2013-01-15 08:24:01 【问题描述】:

我使用 CGAffineTransformMakeRotation 旋转了一个视图。 (iPhone - allow landscape orientation on just one viewcontroller)

如下所示,图像的左右两侧都有白色区域。 我希望图像以黑色背景占据整个空间。(至少在一个维度,宽度或高度)

下面是完整代码

- (void) viewDidLoad

    [super viewDidLoad];

    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.view.backgroundColor = [UIColor blackColor];

    self.imageView.backgroundColor = [UIColor blackColor];
    self.imageView.opaque = NO;
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth |
        UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

    [self.imageView setImageWithURL:[NSURL URLWithString:self.jsonAlbumImage.url_image
                                           relativeToURL: [NSURL URLWithString:@URL_BASE]]
                   placeholderImage: [GlobalHelper placeHolderImage]];

    [self.view addSubview: self.imageView];



- (void)didRotate:(NSNotification *)notification 
    UIDeviceOrientation orientation = [[notification object] orientation];

    if (orientation == UIDeviceOrientationLandscapeLeft) 
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
     else if (orientation == UIDeviceOrientationLandscapeRight) 
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
     else if (orientation == UIDeviceOrientationPortraitUpsideDown) 
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI)];
     else if (orientation == UIDeviceOrientationPortrait) 
        [self.view setTransform:CGAffineTransformMakeRotation(0.0)];
    

-- 编辑--

最后什么对我有用..不知道为什么修改有效..任何解释都会很棒!

  UIDeviceOrientation orientation = [[notification object] orientation];

    CGAffineTransform t;
    CGRect rect;
    if (orientation == UIDeviceOrientationLandscapeLeft) 
        t = CGAffineTransformMakeRotation(M_PI / 2.0);
        rect = CGRectMake(0,0,480,320);
     else if (orientation == UIDeviceOrientationLandscapeRight) 
        t = CGAffineTransformMakeRotation(M_PI / -2.0);
        rect = CGRectMake(0,0,480,320);
     else if (orientation == UIDeviceOrientationPortraitUpsideDown) 
        t = CGAffineTransformMakeRotation(M_PI);
        rect = CGRectMake(0,0,320,480);
     else if (orientation == UIDeviceOrientationPortrait) 
        t = CGAffineTransformMakeRotation(0.0);
        rect = CGRectMake(0,0,320,480);
    
    else
        return; // looks like there are other orientations than the specified 4

    [self.view setTransform:t];
    self.view.bounds = rect;

【问题讨论】:

它看起来占据了整个视图的高度。如果视图的高度大于宽度,这将是理想的行为。 没有黑色背景,顶部和底部都没有被图像占用 您是否为图像视图提供了正确的内容模式 记录控制器视图和图像视图的边界并检查 即使在旋转时它们都是 (320,480)。是的,我尝试将 480,320 设置为 view.frame imageView.frame,但没有解决问题。也许我不应该设置框架的原点? .. brb 【参考方案1】:

- (void)didRotate:(NSNotification *)notification 中,您需要重新布局视图,以便它们占据所有可用空间。你可以这样做:

- (void)didRotate:(NSNotification *)notification 
  UIDeviceOrientation orientation = [[notification object] orientation];

  CGAffineTransform t;
  if (orientation == UIDeviceOrientationLandscapeLeft) 
    t = CGAffineTransformMakeRotation(M_PI / 2.0);
   else if (orientation == UIDeviceOrientationLandscapeRight) 
    t = CGAffineTransformMakeRotation(M_PI / -2.0);
   else if (orientation == UIDeviceOrientationPortraitUpsideDown) 
    t = CGAffineTransformMakeRotation(M_PI);
   else if (orientation == UIDeviceOrientationPortrait) 
    t = CGAffineTransformMakeRotation(0.0);
  

  CGPoint screenCenter = CGPointMake([UIScreen mainScreen].bounds.width/2,[UIScreen mainScreen].bounds.height/2);
  self.view.center = CGPointApplyAffineTransform(screenCenter, t);
  self.view.bounds = CGRectApplyAffineTransform([UIScreen mainScreen].bounds, t);
  [self.view setTransform:t];


地点:

CGRectApplyAffineTransform

对矩形应用仿射变换。

       CGRect CGRectApplyAffineTransform (
           CGRect rect,
           CGAffineTransform t
         );

尝试同时删除此行:

self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

如果您不打算使用自动旋转,则不需要它,我担心它可能会与您自己设置视图框架发生冲突。这只是一个假设,说明您没有看到视图的框架发生变化。

编辑:

我很想知道这个变换的东西是做什么的

嗯,transform 正在做旋转。

旋转是相对于用作枢轴的锚点;发生的情况是,如果锚点不在正在旋转的视图的中间,那么视图也会被平移(想象一下围绕顶点的旋转)。

因此,设置边界以使事情变得均匀是正确的;的确,我只是在用以下几行来建议:

  self.view.center = CGPointApplyAffineTransform(screenCenter, t);
  self.view.bounds = CGRectApplyAffineTransform([UIScreen mainScreen].bounds, t);

但可能对中心和边界应用相同的变换的想法没有得到祝福。 (这也是为什么我要一些痕迹,看看发生了什么:-)

【讨论】:

CGRectApplyCGAffineTransform 的返回值是 int.. 你介意解释一下为什么删除 autoresizingMask 可以帮助解决这种情况吗? 抱歉,正确的拼写是CGRectApplyAffineTransform。有关详细信息,请参阅我编辑的答案。 试过了,但不起作用..图像在纵向以外的其他旋转中消失。我记录了 view/imageView 的边界,它是 (480,320) 这是一个很好的开始。像我在编辑的答案中建议的那样设置视图中心怎么样? 稍微好一点,如果我旋转到垂直(变成全白),然后回到纵向,图像就在那里..

以上是关于iphone的旋转视图不占用整个屏幕的主要内容,如果未能解决你的问题,请参考以下文章

iPhone如何显示不同的视图控制器以响应设备旋转?

如何捕获当前视图屏幕截图并在代码中重用? (iPhone SDK)

iPhone:使用尺寸类旋转设备时更改背景图像

如何锚定相对于屏幕 iPhone 一侧的视图

我在 iPHone 上的 Quartz 绘图在旋转后被剪掉了!

iPhone应用程序主视图不旋转但需要在调用UIWebView时旋转?