1

我在我的程序中有一個主視圖,其中有一個可拖動的視圖。這個視圖可以用平移手勢拖動。目前雖然它使用了很多我想放在子類中的代碼來降低複雜性。 (我最終希望通過允許用戶通過進一步的平移手勢來擴展視圖來增加功能,這意味着如果我不能先排序,將會有更多的代碼堵塞我的視圖控制器)我可以將手勢識別器的代碼放在視圖的子類中嗎?

是否有可能在類的子類中擁有手勢識別器的代碼,並仍然與父類中的視圖進行交互。

這是我使用,以便能夠在父類移動手勢當前代碼:

-(void)viewDidLoad { 

    ... 


    UIView * draggableView = [[UIView alloc]initWithFrame:CGRectMake(highlightedSectionXCoordinateStart, highlightedSectionYCoordinateStart, highlightedSectionWidth, highlightedSectionHeight)]; 
draggableView.backgroundColor = [UIColor colorWithRed:121.0/255.0 green:227.0/255.0 blue:16.0/255.0 alpha:0.5]; 
    draggableView.userInteractionEnabled = YES; 

    [graphView addSubview:draggableView]; 

    UIPanGestureRecognizer * panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panWasRecognized:)]; 

    [draggableView addGestureRecognizer:panner]; 

} 

- (void)panWasRecognized:(UIPanGestureRecognizer *)panner { 

    UIView * draggedView = panner.view; 
    CGPoint offset = [panner translationInView:draggedView.superview]; 
    CGPoint center = draggedView.center; 

    // We want to make it so the square won't go past the axis on the left 
    // If the centre plus the offset 

    CGFloat xValue = center.x + offset.x; 

    draggedView.center = CGPointMake(xValue, center.y); 

    // Reset translation to zero so on the next `panWasRecognized:` message, the 
    // translation will just be the additional movement of the touch since now. 
    [panner setTranslation:CGPointZero inView:draggedView.superview]; 
} 

(Thanks to Rob Mayoff for getting me this far)

我現在已經添加視圖的一個子類,但不能弄清楚如何或我需要創建手勢識別器,因爲視圖正在子類中創建並添加到父類中。

我真的希望手勢識別器的目標是在這個子類中,但是當我嘗試編碼時它什麼也沒有發生。

我試圖把在子類中的所有代碼,並添加移動手勢的看法,但後來我得到一個壞的訪問崩潰,當我試圖拖動它。

我目前正在使用

[graphView addSubview:[[BDraggableView alloc] getDraggableView]]; 

將其添加到子視圖,然後設置在功能getDraggableView(加入移動手勢等)的觀點在子類中

必須有一種更直接的做法,我還沒有將其概念化 - 我仍然很新的處理子類,所以我仍然在學習它們如何融合在一起。

感謝您的幫助,您可以給

回答

1

我想我可能會想出這一個。

在我創建的子類變量父類:在graphView

然後:

BDraggableView * draggableViewSubClass; 
draggableViewSubClass = [[BDraggableView alloc] initWithView:graphView andRangeChart: [rangeSelector getRangeChart]]; 

這讓我的觀點初始化子類,我想對可拖動視圖子視圖我設置的移動手勢,我通常會,但它加入到這一觀點進行過:

- (id)initWithView:(UIView *) view andRangeChart: (ShinobiChart *)chart { 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     // Custom initialization 
     parentView = view; 

     [self setUpViewsAndPans]; 
    } 
return self; 
} 

- (void)setUpViewsAndPans { 

    draggableView = [[UIView alloc]initWithFrame:CGRectMake(highlightedSectionXCoordinateStart, highlightedSectionYCoordinateStart, highlightedSectionWidth, highlightedSectionHeight)]; 
    draggableView.backgroundColor = [UIColor colorWithRed:121.0/255.0 green:227.0/255.0 blue:16.0/255.0 alpha:0.5]; 
    draggableView.userInteractionEnabled = YES; 

    // Add the newly made draggable view to our parent view 
    [parentView addSubview:draggableView]; 
    [parentView bringSubviewToFront:draggableView]; 

    // Add the pan gesture 
    UIPanGestureRecognizer * panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panWasRecognized:)]; 
    [draggableView addGestureRecognizer:panner]; 
} 

- (void)panWasRecognized:(UIPanGestureRecognizer *)panner { 

    UIView * draggedView = panner.view; 
    CGPoint offset = [panner translationInView:draggedView.superview]; 
    CGPoint center = draggedView.center; 

    CGFloat xValue = center.x + offset.x; 

    draggedView.center = CGPointMake(xValue, center.y); 

    // Reset translation to zero so on the next `panWasRecognized:` message, the 
    // translation will just be the additional movement of the touch since now. 
    [panner setTranslation:CGPointZero inView:draggedView.superview]; 
} 

我花了一段時間來理順它在我的頭上我們想要做的所有建立在我們的子類,然後添加這一觀點,其特點父視圖。

感謝您提供的所有答案,他們讓我沿着正確的方向思考解決問題

0

我想你想繼承UIView,使自己的DraggableView類。在這裏,您可以添加滑動和平移手勢識別器。這將是在執行子類UIView

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     UIGestureRecognizer *gestRec = [[UIGestureRecognizer alloc] initWithTarget:self 
                      action:@selector(detectMyMotion:)]; 
     [self addGestureRecognizer:gestRec]; 
    } 
    return self; 
} 

- (void)detectMyMotion:(UIGestureRecognizer *)gestRect 
{ 
    NSLog(@"Gesture Recognized"); 
    // maybe even, if you wanted to alert your VC of a gesture... 
    [self.delegate alertOfGesture:gestRect]; 
    // your VC would be alerted by delegation of this action. 
} 
相關問題