在 UIScrollView 问题中旋转 UIImageView

Posted

技术标签:

【中文标题】在 UIScrollView 问题中旋转 UIImageView【英文标题】:Rotate UIImageView inside UIScrollView issue 【发布时间】:2012-10-08 08:13:09 【问题描述】:

我必须像照片应用一样实现旋转工作。在UIScrollView 中包含UIImageView。当设备旋转时,我希望图像像照片一样旋转到横向。如果图像是横向的,那么它将用旋转动画填充整个UIScrollView 的宽度。当下面的代码

[UIView animateWithDuration:0.36
               animations:^(void)
                [_imageView setTransform:CGAffineTransformMakeRotation(M_PI*90/180)];
                 _imageView.frame = CGRectMake(0, 0, 480, 320); //set the frame after the rotate
                self.contentSize = CGSizeMake(480, 320); //set the content-size of the scrollview
               
               completion:^(BOOL complete)
               ];

但这不起作用。发生旋转,但_imageView 的位置不正确,或者图像没有填满宽度。即使我在转换之前更改了订单框架和内容大小,仍然不正确。

正确的方法是什么?

【问题讨论】:

【参考方案1】:

WWDC 2010 Video: Designing Apps with Scrolls Views 向您展示了具体的操作方法。

【讨论】:

我一直在寻找这将如何帮助解决我遇到的布局更改问题。他们根本没有讨论布局更改。 @RameezHussain - 他们可能没有在视频中确切地谈论它,但这一切都在视频附带的代码中。他们向您展示了如何在 UIScrollView 中制作该 imageView,以便在您平移和缩放它之后居中并保持在边界内。此外,当你旋转它时,如果 UIImageView 的高度和宽度小于超级视图的边界,它会缩放它以适应新的边界。 我从建议的视频中找到了答案。但由于评论大小有限制,我为这个问题添加了另一个答案。【参考方案2】:

在我看来,正确的答案是根本不要自己为旋转设置动画。

如果您按照最新的ios 6 准则工作,那么您只需在ViewControllerlayoutSubviews() 方法中重新排列您的views

【讨论】:

问题是在我的视图控制器(打算)中不会发生旋转,UIScrollView 是一个弹出子视图,其中包含带有黑色背景的 UIImageView。只想旋转 UIImageView,但视图控制器的整个视图。 为什么不想旋转视图控制器? 我正在使用 uitabview-controller,在其中一个 view-controller 中,我有一个 tableview,如果 table-cell 有图像,点击时会弹出。所以我只想旋转弹出图像,而不是整个 uitabview-controller。 是的。我已经解决了这个问题。我做的一切都是正确的。我只需要将这条语句添加到我的代码中:myScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;【参考方案3】:

@CoDEFRo 所指的源码类似如下,不过这里我放到了UIScrollView的委托方法scrollViewDidScroll:中。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView    
    CGSize boundsSize = scrollView.bounds.size;
    CGRect frameToCenter = self.imageView.frame;

    if (frameToCenter.size.width < boundsSize.width)
        frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
    else
        frameToCenter.origin.x = 0;

    if (frameToCenter.size.height < boundsSize.height)
        frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
    else
        frameToCenter.origin.y = 0;

    self.imageView.frame = frameToCenter;

【讨论】:

以上是关于在 UIScrollView 问题中旋转 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中旋转 UIViewControllers

在 iPhone 中使用 UIScrollView 和 ImageView 滚动图像

如何在 UIScrollview 中触发 UIViewcontroller 视图的旋转事件

如何访问添加到 UIScrollView 的 UIView 上的控件

在 UIScrollview Swift 中旋转 UIView

如何在 UIScrollView 中拉伸 UITextViews 以适应旋转后的水平尺寸?