React Native Invalidate Native View - PullRequest
       8

React Native Invalidate Native View

0 голосов
/ 09 января 2020

Я работаю над собственным компонентом пользовательского интерфейса. Я пытаюсь выяснить, как сделать недействительным собственное представление, чтобы оно снова отображалось на экране. Я пытаюсь добиться чего-то вроде HTML холста, который позволял бы динамически рисовать различные формы и изображения, а также анимировать эти формы с течением времени. Чтобы сделать это, я подумал, что мог бы просто переопределить методы draw() на каждой платформе, и это отразило бы все, что мне представлялось.

Однако, когда я вызываю View.invalidate() или UIView.setNeedsDisplay(), метод рисования не вызывается. Более того, даже если я вызову метод draw(), на экран ничего не выводится.

На Android Я наконец смог найти обходной путь, вызвав View.invalidateOutline(). По какой-то причине этот метод привел к вызову draw() и перерисовке экрана. Но я не смог найти подобный обходной путь на iOS, хотя я пробовал все под солнцем.

Я даже пытался установить библиотеку ART target- C, чтобы посмотреть, будет ли она делать то, что я хочу, но увидел, что та же самая проблема (SurfaceView.invalidate()) не вызовет draw().

Я предполагаю, что React Native контролирует, будут ли вещи перерисовываться через какой-то внутренний обмен сообщениями. Мой вопрос: есть ли какой-нибудь способ уведомить, что родное представление изменилось и должно быть перерисовано. Или это ошибка, которую UIView.setNeedsDisplay() не рендерит повторно?

Реагирует Родная версия: 61.5

Шаги для воспроизведения

iOS (target- c):

- (void)createShape:(int)x y:(int)y
{
    // add a new shape object to be drawn
    [shapes addObject:[NSNumber numberWithInt:x]];

    // drawRect() is not called
    [self setNeedsDisplay];

    // drawRect() is called, but the screen does not update/re-render with the new shape
    [[self layer] setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    RCTLog(@"drawRect()");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect bounds = self.bounds;
    CGContextClearRect(context, bounds);

    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
    // even when this method is called, the rectangle is not drawn
    CGContextFillRect(context, rectangle);
}

Android (kotlin):

  fun createShape(x: Float, y: Float) {
        shapes.add(Drop(x, y, 0F))

        draw(_canvas)

        // screen does not update
       invalidate()

       // updates screen
        invalidateOutline()
    }

Также ссылка на весь проект в его текущем состоянии (есть много комментариев / скретч-кода как я пробую все разные методы): https://github.com/twalk4821/draw

Спасибо.

...