Слушайте методы (touchesBegan, touchesMoved, touchesEnded) в UIView (подкласс) и не родительский UIViewController? - PullRequest
0 голосов
/ 07 апреля 2019

Я новичок в разработке для iOS.

Я пытаюсь создать приложение Doodle, я не использую раскадровки. Мой код примерно такой:

  • У меня есть UIViewController с именем VWDashboard .

  • VWDashboard добавляет UIView в качестве подпредставления с именем Doodle .

  • Doodle * Предполагается, что подпредставление 1024 * - это экран, на котором будет рисоваться каракули, так как на Dashboard есть другие виды и прочее ... Dahsboard "откроет" этот Doodle просмотр (добавить как подпредставление).

  • Чтобы нарисовать каракули, мне нужно получить методы touchesBegan, touchesMoved, touchesEnded, вызываемые на моем UIView, но я получаю его на моей VWDashboard . В VWDashboard у меня есть это:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [doodleDelegate touchBegan:touches withEvent:event];
        NSLog(@"Dashboard: touchesBegan");
    }
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
       [doodleDelegate touchMoved:touches withEvent:event];
        NSLog(@"Dashboard: touchesMoved");
    }
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        [doodleDelegate touchEnded:touches withEvent:event];
        NSLog(@"Dashboard: touchesEnded");
    }
    

В моем UIView эти методы объявлены (я думаю, что для переопределения), и у меня есть код для рисования каракуля (я сделал небольшую демонстрацию на UIViewController и работал).

Когда я касаюсь экрана, все эти журналы можно увидеть, но методы в подпредставлении не вызываются.

Я пытался создать делегат, который «слушает» методы на VWDashboard и передает данные в мой UIView Doodle, чтобы каракули рисовались в соответствующем UIImageView и т. Д., Но не работает:

VWDashboard.h

    @class Doodle;
    @protocol DoodleDelegate <NSObject>

    - (void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchEnded:(NSSet *)touches withEvent:(UIEvent *)event;

    @end

    @interface VWDashboard : VWBase {
        id <DoodleDelegate> delegate;
    }

    @property (retain, nonatomic) id <DoodleDelegate> delegate;

    @end

Doodle.h

    #import <UIKit/UIKit.h>
    #import "VWDashboard.h"

    NS_ASSUME_NONNULL_BEGIN

    @interface Doodle : UIView <DoodleDelegate> {

        // Drawing
        CGPoint lastPoint;
        CGFloat red;
        CGFloat green;
        CGFloat blue;
        CGFloat brush;
        CGFloat opacity;
        BOOL mouseSwiped;
    }

    @end

    NS_ASSUME_NONNULL_END

Doodle.m

    #import "Doodle.h"
    #import "SCLAlertView.h"

    @implementation Doodle {

        UIImageView *canvasSignature, *canvasDoodle;
    }

    - (id)initWithFrame:(CGRect)frame {

    /// renderUI ....

        return self;
    }

    -(void) renderUI...

    - (void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    // Drawing code

    }
    - (void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        // Drawing code
    }
    - (void)touchEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // Drawing code
    }

    @end

Вот так я устанавливаю делегата в VWDashboard :

    Doodle *doodl = [[Doodle alloc] initWithFrame: _moduleLayoutActive.bounds];
    [self setDoodleDelegate:doodl];
    [_moduleLayoutActive addSubview: doodl];

Пожалуйста! Любая помощь, которую я действительно ценю, спасибо!

1 Ответ

1 голос
/ 07 апреля 2019

Это то, что вы можете сделать ....

(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch= [touches anyObject];
    if ([touch view] == yourView)
    {
        //your code
    }

}

(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch= [touches anyObject];
    if ([touch view] == yourView)
    {
        //your code
    }

}

(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch= [touches anyObject];
    if ([touch view] == yourView)
    {
        //your code
    }

}

Надеюсь, это поможет.

...