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

时间:2014-06-03 20:37:41

标签: ios objective-c core-graphics cgaffinetransform icarousel

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

我正在执行动画,我将CGAffineTransformMakeScale应用于UIScrollView,并且在这样做时,视图会缩小,但视图的其余部分将会缩放,但不会绘制任何内容。我知道这是因为在进行转换时该区域是屏幕外的,但我想知道如何解决这个问题。

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

在此处的图像中,最上面的切片显示屏幕底部的图像,截止,然后第二个图像在转换时显示它们,不再显示在屏幕的底部,但仍然截止位置。我希望在缩小视图时可以看到其余图像。

我该如何解决这个问题?enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

原来我需要做的就是为转盘内的clipsToBounds个实例关闭scrollView。 D'哦!