contentMode与clipsToBounds合用实现显示图片的内容与实际图片大小不一样的特殊情况

有这样的需求, 一个UIimage的大小为768*1024, 被一个UIImageView加载到界面上。

显然, 这个时候,它的

contentMode;                // default is UIViewContentModeScaleToFill

以及

clipsToBounds;              // When YES, content and subviews are clipped to the bounds of the view. Default is NO.

这个时候, 我们需要这个UIImageView产生一个交互, 如拖动,点击等。 

但是我们还把这个UIImageView加入到一个滚动背景中。 


因为我们同时需要在这个UIImageView上作一些交互, 而背景又是一个滚动背景, 如果我们所做的交互正好又是一个拖动, 那么问题就来了。  因为我们的拖动把背景的滚动视图的交互给截获了。 如何解决呢?

1, 我们可以定制这个UIImageView为一个UIControl控件, 然后在传递事件时,通过一些判断条件,把事件继续向下传递。 就可以做到。 但实际过程中, 这个判断条件很难写出。


2。我们换用一种较为简单的方式, 通常我们这个UIImageView的交互部分, 不会是一个768*1024的区域, 而会是一个小部分区域,如左上角的300*400, 在这个基础上, 我们就有了一种解决办法。

就是把这个UIimageView的frame设置成300*400, 同时支持拖动事件, 并继续放置在整个滚动视图的背景上。 这样除开这300*400区域的部分, 仍然可以响应用户在滚动视图上的拖动。

那么如何把这个UIImageView的frame设置成300*400, 但显示的时候仍然显示这个UIImageView的整个768*1024的内容呢。

用ContentMode以及ClipsToBounds.

上代码:

    _dragView = [[UIImageView alloc] initWithFrame:CGRectFromString(@"{{0,0},{300,400}}")];

    UIImage *image = [UIImage imageNamed:@"t1.png"];

    _dragView.image = image;

    [self.view addSubview:_dragView];

    _dragView.backgroundColor = [UIColor redColor];

    _dragView.clipsToBounds = NO;

    _dragView.contentMode = UIViewContentModeTopLeft;

    NSLog(@"_dragView.frame=%@", NSStringFromCGRect(_dragView.frame));


    //创建一个平移手势对象,该对象可以调用handelPan:方法

    UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handelPan:)];

    panGes.delegate = self;

    _dragView.userInteractionEnabled = YES;

    [_dragView addGestureRecognizer:panGes];


添加完成后, 我们会发现这个输出的frame即为0, 0, 300, 400. 红色部分为该UIImageView的frame位置。 只有这部分内容才会被添加拖动手势。 其它地方的部分不会响应这个拖动手势。 会被背部的滚动视图所响应。

注:

1。 上面把contentMode设置成UIViewContentModeTopLeft是为了更好的以左上角为基础作计算点。

2。 上面的这个clipsToBounds默认为No, 所以设置不设置没关系的。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值