Я работаю над собственным компонентом пользовательского интерфейса. Я пытаюсь выяснить, как сделать недействительным собственное представление, чтобы оно снова отображалось на экране. Я пытаюсь добиться чего-то вроде 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
Спасибо.