iCarousel 上的缩放变换显示屏幕外的区域

Posted

技术标签:

【中文标题】iCarousel 上的缩放变换显示屏幕外的区域【英文标题】:Scale transform on iCarousel showing area off-screen 【发布时间】:2014-06-03 20:37:40 【问题描述】:

我有一个iCarousel,其中包含一些位于屏幕底部下方的元素(即它们可以滚动到)。

我正在执行一个动画,我将CGAffineTransformMakeScale 应用到UIScrollView,这样做时,视图会缩小,但视图的其余部分会在哪里绘制,什么都不会绘制。我知道这是因为在进行变换时该区域不在屏幕上,但我想知道如何解决这个问题。

理想情况下,当我开始转换时,它应该绘制轮播的全部内容,包括屏幕外的内容,然后执行缩放动画,这意味着之前屏幕外的部分区域会显示出来。

在此处的图像中,最上面的切片显示屏幕底部的图像,截断,然后第二个图像显示变换后的图像,不再位于屏幕底部,但仍处于截断状态位置。我希望这些图像的其余部分在缩小视图时变得可见。

我该怎么办?

【问题讨论】:

【参考方案1】:

我认为您正在做的是缩小滚动视图,而不是缩小滚动视图正在显示的内容。

我建议使用 UIScrollView 的缩放功能来缩小内容。为了使其工作,所有内容必须包含在一个视图中。由于您似乎有多个图像(作为多个 UIImageViews),您需要做的第一件事是创建一个通用 UIView 并将所有 UIImageViews 添加为通用视图的子视图。

然后,要使用滚动视图的缩放功能,您需要执行以下操作。

声明视图控制器符合 <UIScrollViewDelegate>协议 从viewForZoomingInScrollView返回要缩放的视图 方法 设置初始缩放参数、contentSize 和委托 滚动视图 调整缩放级别时,确保新的缩放级别是 有效

最后一点只是意味着当您更改zoomScale 时,旧的zoomScale 和新的zoomScale 必须都在minimumZoomScalemaximumZoomScale 之间。

在下面的示例代码中,我有一个滚动视图和一个正在缩放和滚动的UIImageView。为了测试,我有几个按钮可以更改缩放级别。请注意,在调整缩放级别后,我通过将最小和最大缩放比例都设置为当前缩放比例来禁用缩放(防止用户更改缩放级别)。

@interface MainViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation MainViewController

- (void)viewDidLoad

    [super viewDidLoad];

    CGRect frame = CGRectZero;

    self.imageView.image = [UIImage imageNamed:@"SomeImage"];
    frame.size = self.imageView.image.size;
    self.imageView.frame = frame;

    self.scrollView.minimumZoomScale = 1.0;
    self.scrollView.maximumZoomScale = 1.0;
    self.scrollView.zoomScale = 1.0;
    self.scrollView.contentSize = frame.size;
    self.scrollView.delegate = self;


- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

    return( self.imageView );


- (void)adjustZoomLevel:(CGFloat)newZoom

    if ( newZoom > self.scrollView.zoomScale )
    
        self.scrollView.maximumZoomScale = newZoom;
        [self.scrollView setZoomScale:newZoom animated:YES];
        self.scrollView.minimumZoomScale = newZoom;
    
    else
    
        self.scrollView.minimumZoomScale = newZoom;
        [self.scrollView setZoomScale:newZoom animated:YES];
        self.scrollView.maximumZoomScale = newZoom;
    


- (IBAction)zoomInButtonPressed

    [self adjustZoomLevel:self.scrollView.zoomScale * 1.25];


- (IBAction)zoomOutButtonPressed

    [self adjustZoomLevel:self.scrollView.zoomScale * 0.80];


@end

【讨论】:

我正在依次缩小滚动视图中的每个视图,而不是滚动视图本身,但缩放听起来很有趣,我会试试看。我现在实际上正在使用 iCarousel,所以希望它也能在那里工作。 唉,iCarousel 没有缩放选项,所以我想我需要使用变换。【参考方案2】:

结果我需要做的就是关闭 clipsToBounds 在轮播中的 scrollView 实例。哦!

【讨论】:

以上是关于iCarousel 上的缩放变换显示屏幕外的区域的主要内容,如果未能解决你的问题,请参考以下文章

为什么“缩放”的显示设置和使用多个监视器导致我的WPF应用程序窗口在我的显示器上的其他区域中设置动画?

在重绘屏幕之前,如何阻止 iPhone 显示变换更改

延伸到屏幕外的 HTML 表格

带有缩放的 Windows 屏幕截图

屏幕上鼠标位置周围区域的缩放框[关闭]

为啥当我切换到上一个屏幕时,iCarousel 视图中的图像会显示在上一个屏幕中?