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

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

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

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

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

我该怎么办?

【问题讨论】:

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


    【解决方案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 实例。哦!

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多