Улучшение сенсорных событий UIImageView - PullRequest
0 голосов
/ 04 августа 2011

У меня открыто 30-40 вкладок, я нашел ответ ... но я хочу улучшить. Код работает, я просто не уверен, что он эффективен

Следующий код показывает, что у меня есть 2 небольших изображения (одно с использованием UIImageView, другое с использованием UIView), в котором я подключен к UIScrollView, который присоединен к UIView, который поставляется с UIViewController, который присоединен к UIWindow. Довольно простой.

У меня также есть кнопка, прикрепленная к UIViewController, чтобы убедиться, что масштабирование и прокрутка работают. (Путем проверки статического расположения кнопки и размера)

@interface Wire_TestViewController : UIViewController <UIScrollViewDelegate> {
UIScrollView *scrollview;
}
@end

Реализация:

- (void)test:(UIButton *)sender {  }
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return scrollview; }
- (void)viewDidLoad {
    [super viewDidLoad];

    scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    scrollview.delegate = self;
    scrollview.contentSize = CGSizeMake( 320*2, 480*2 );
    scrollview.minimumZoomScale = .1;
    scrollview.maximumZoomScale = 10;
    [self.view addSubview:scrollview];

    UIImageView *view = [[UIImageView alloc] initWithFrame:CGRectMake(320, 320, 20, 20)];
    view.image = [UIImage imageNamed:@"Node.png"];
    view.clearsContextBeforeDrawing = NO;
    [scrollview addSubview:view];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(10, 10, 100, 30);
    button.tag = 51;
    [button setTitle:@"new button" forState:(UIControlState)UIControlStateNormal];
    [button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 30, 30)];
    view2.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"WireActive.png"]];
    [scrollview addSubview:view2];

    TestSubclass *test = [[TestSubclass alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
    test.userInteractionEnabled = TRUE;
    test.image = [UIImage imageNamed:@"Node.png"];
    [scrollview addSubview:test];
}

Внизу вы увидите, что у меня есть класс TestSubclass. Код для этого выглядит следующим образом:

@interface TestSubclass : UIImageView {  }
@end

@implementation TestSubclass
- (id)init {
    [super init];
    self.userInteractionEnabled = TRUE;
    return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    printf("Being touched...\n");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    printf("Touches Ended...\n");
}
@end

Часть, в которой я доволен, заключается в том, что у меня есть полностью функционирующий подкласс UIImageView, который работает так, как если бы это был UIButton. НО! без 7 backgroundImageViews (и накладных расходов от каждого из них), без 6 меток (и накладных расходов от каждого из них), без 6 UIImageViews ("...") и, наконец, количество ненужных вещей, которые UIButton предлагает. Я только хотел возможности касания .. эффективно однако. (TouchUpInside, перетаскивание и т. Д.)

Но теперь, во время моего исследования (после обширного тестирования, чтобы выполнить это много), я наткнулся на документацию и некоторые примеры addGestureRecognizer в UIView. Кажется, что-то вроде, но не совсем эффективно для моих нужд.

Я ищу совет, я знаю, что в моем коде есть пара проблем (переопределена init, но не использовала ее в приведенном выше коде .. не выпустила .. возможно, некоторые ошибки подкласса (плохо знакомы с subClassing) (честно говоря). Но все очень ценится !! И, надеюсь, другим тоже помогут!

1 Ответ

1 голос
/ 04 августа 2011

Если вы хотите иметь возможности полного контроля, вы должны создать подкласс UIControl и использовать свое изображение с in. Изображение может быть подпредставлением UIImageView или может быть нарисовано в методе drawRect вашего подкласса или задано в содержимом представления CALayer.Обратите внимание, что создание подклассов UIControl - не самая простая вещь, но она дает вам все функции «контроля», которые, как вам кажется, вы запрашиваете, и я думаю, что это наиболее эффективный или подходящий подход.

...