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 SDK)