2017-11-21 13 views
0

サブビューとして追加された別のUIViewが内部にある私のVCのビュー(self.view)であるUIViewがあります。私はスーパービュー内のサブビューの動きを制限したいと思います。基本的には、サブビューはスーパービュー境界の外に出てはなりません。
私は、この作品とサブビューが動いているが、それはまた、スーパーの外に移動しスーパービュー境界内のサブビューの移動を制限する

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
// i check if point of touch is inside my superview i set the center i.e 
UITouch *touch = [[UITouch allObjects] firstObject]; 
if (CGRectContainsPoint(subview.frame, [touch locationInView:self.view])) { 
// set the center here... i.e 
subview.center = [touch locationInView:self.view]; 
} 

を実装しました。どのようにしてスーパービュー内での動きを制限できますか?

私は同じようなものを試しました。

if (CGRectContainsRect(self.view.bounds, subview.frame)) { 
// this condition works but i don't know why my subview sticks to the sides of superview if i try to drag it through the bounds of superview 
} 

私もtouchesBegan、touchesCancelledで何もしない、とtouchesEnd内の関連は何もありません。代わりにセンタリングを、

@implementation DraggableView 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // restrict to superview bounds 
    CGRect parentFrame = [self.superview bounds]; 

    UITouch *aTouch = [touches anyObject]; 
    CGPoint location = [aTouch locationInView:self]; 
    CGPoint previousLocation = [aTouch previousLocationInView:self]; 

    // new frame for this "draggable" subview, based on touch offset when moving 
    CGRect newFrame = CGRectOffset(self.frame, (location.x - previousLocation.x), (location.y - previousLocation.y)); 

    if (newFrame.origin.x < 0) { 

     // if the new left edge would be outside the superview (dragging left), 
     // set the new origin.x to Zero 
     newFrame.origin.x = 0; 

    } else if (newFrame.origin.x + newFrame.size.width > parentFrame.size.width) { 

     // if the right edge would be outside the superview (dragging right), 
     // set the new origin.x to the width of the superview - the width of this view 
     newFrame.origin.x = parentFrame.size.width - self.frame.size.width; 

    } 

    if (newFrame.origin.y < 0) { 

     // if the new top edge would be outside the superview (dragging up), 
     // set the new origin.y to Zero 
     newFrame.origin.y = 0; 

    } else if (newFrame.origin.y + newFrame.size.height > parentFrame.size.height) { 

     // if the new bottom edge would be outside the superview (dragging down), 
     // set the new origin.y to the height of the superview - the height of this view 
     newFrame.origin.y = parentFrame.size.height - self.frame.size.height; 

    } 

    // update this view's frame 
    self.frame = newFrame; 
} 

@end 

これは、タッチのオフセットを使用しています:

答えて

1

はあなたが動いているビューの「新しいフレーム」をチェックし、そのスーパーの境界にそのエッジを比較する必要がありますタッチ上のビュー(ドラッグを開始するときに「指にジャンプ」しない)。

説明のために編集:この画像では、ブルービュークラスはDraggableViewです。スーパービュー(赤色のビュー)の外にドラッグすることはできません。

enter image description here

+0

ビンゴ@DonMag:)..... 1点の明確化は、しかし、それだけで原因このタッチに私の解決策が働いていなかったことを相殺されました? – user2606782

+0

ここには1つの問題があります。私はスーパービューに沿ってドラッグすると、サブビューはドラッグされてしまいます.tuchesBeganはそれ(スーパービュー)のために働いていると思います。どうすればこれを避けることができますか? – user2606782

+0

@ user2606782 - あなたが何を求めているのかはっきりしていません...私の答えでは画面キャプチャの編集を参照してください。多分役立つでしょうか? – DonMag

関連する問題