有這樣的需求, 一個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, 所以設定不設定沒關係的。