有这样的需求, 一个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];
注:
1。 上面把contentMode设置成UIViewContentModeTopLeft是为了更好的以左上角为基础作计算点。
2。 上面的这个clipsToBounds默认为No, 所以设置不设置没关系的。