iPhone的旋转视图不会占据整个屏幕 [英] iphone's rotated view doesn't take up whole screen

查看:70
本文介绍了iPhone的旋转视图不会占据整个屏幕的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用CGAffineTransformMakeRotation旋转了一个视图.( iPhone-仅允许在一个viewcontroller上横向放置)

I rotated a view using CGAffineTransformMakeRotation. ( iPhone - allow landscape orientation on just one viewcontroller )

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

As you can see below, the images have white region in left and right.
I want the image take up the whole space with black background.(at least in one dimension, width or height )

下面是完整的代码

- (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)];
    }
}

-编辑-

最后对我有用的..不知道为什么修改确实起作用..任何解释都很好!

What worked for me in the end .. don't know why modification does work.. any explanation would be great!

  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;

推荐答案

-(void)didRotate:(NSNotification *)notification 中,您需要中继视图,以便它们占据所有空间可用的.您可以执行以下操作:

In - (void)didRotate:(NSNotification *)notification, you need to relayout your views so that they occupy all the space available. You could do something like this:

- (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

CGRectApplyAffineTransform

将仿射变换应用于矩形.

Applies an affine transform to a rectangle.

       CGRect CGRectApplyAffineTransform (
           CGRect rect,
           CGAffineTransform t
         );

也尝试删除此行:

self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

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

You don´t need it if you are not going to use autorotation and I fear it might conflict with your own setting the view's frame. This is just an hypothesis to account for the fact that you are not seeing the view´s frame change.

我非常想知道这种转换的作用

I'd very much like to know what this transform thing does

好吧,变换正在旋转.

相对于用作枢轴的锚点旋转;发生的情况是,如果锚点不在旋转的视图中间,则视图也将平移(想象绕顶点旋转).

rotating is relative to an anchor point which is used as a pivot; what happens is that if the anchor point is not in the middle of the view being rotated, then the view is also translated (imagine a rotation around a vertex).

因此,设置界限以使事物均匀是正确的;确实,我只是用以下几点建议:

So, it is correct to set the bounds to make things even; indeed I was suggesting just that with the lines:

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

,但可能不希望对中心和边界应用相同的变换.(这也是为什么我要求提供一些跟踪信息以查看发生了什么的原因:-)

but possibly the idea of applying the same transform to both the center and the bounds was not blessed. (that is also why I asked for some traces, to see what was happening :-)

这篇关于iPhone的旋转视图不会占据整个屏幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆