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 必须都在minimumZoomScale
和maximumZoomScale
之间。
在下面的示例代码中,我有一个滚动视图和一个正在缩放和滚动的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 上的缩放变换显示屏幕外的区域的主要内容,如果未能解决你的问题,请参考以下文章