как настроить ввод drawRect

Вот мой код drawRect:

- (void)drawRect:(CGRect)rect {
  if (currentLayer) {
    [currentLayer removeFromSuperlayer];
  }

  if (currentPath) {
    currentLayer = [[CAShapeLayer alloc] init];

      currentLayer.frame = self.bounds;


    currentLayer.path = currentPath.CGPath;

      if ([SettingsManager shared].isColorInverted) {
          currentLayer.strokeColor = [UIColor blackColor].CGColor;
      } else {
          currentLayer.strokeColor = [UIColor whiteColor].CGColor;

      }

      currentLayer.strokeColor = _strokeColorX.CGColor;




    currentLayer.fillColor = [UIColor clearColor].CGColor;
    currentLayer.lineWidth = self.test;

    currentLayer.contentsGravity = kCAGravityCenter;
    [self.layer addSublayer:currentLayer];

    //currentLayer.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
  }
  //[currentPath stroke];
}

«Часть границ представления, которую необходимо обновить»

Это из документации разработчика Apple.

Я имею дело с UIView и устройством, которое называется планшет - планшет имеет возможность записывать карандашные рисунки в мое приложение для iOS. Мне удалось заставить его работать над всем видом. Но я не хочу, чтобы все представление было заполнено вводом сланца. Вместо этого я хотел бы изменить UIView, чтобы он имел высоту телефона - 40 пикселей; Имеет смысл?

# uiview
Источник
  • 0
    Насколько я понимаю, похоже, что вы пытаетесь создать холст, на котором пользователь может рисовать. Это верно?
  • 0
    Да, точно. Хотите скриншот?
  • 0
    Мне не нужен скриншот, но я думаю, что ваши вопросы могут быть слишком общими.
  • 0
    Хм. Я постараюсь уточнить. Я хочу узнать, как передать мой собственный CGRect do drawRect
  • 0
    В прошлом году Apple выпустила несколько примеров кода , демонстрирующих, как захватывать сенсорный ввод и отображать их в виде штрихов. Это может быть хорошим ресурсом для проверки.
  • 0
    Проверил - не нашел то, что хотел.
  • 0
    drawRect действительно предназначен только для «рисования» и, как таковой, не совсем подходящее место для добавления или изменения подслоев. Вы можете использовать его, чтобы нарисовать линию между предыдущими местоположениями пера и только указать своему виду, чтобы перерисовать область вокруг последнего местоположения пера, или вы можете посмотреть на добавление подслоев в местоположении пера - каким-то другим способом, который вы определяете - на основе некоторых своего рода событие / обратные вызовы о движении пера.
Codelisting
за 0 против

Я думаю, вы путаете значения различных прямоугольников в UIView. Параметр drawRect обозначает частичный раздел представления, который необходимо перерисовать. Это может быть то, что вы вызвали setNeedsDisplay (rect), или это может быть потому, что iOS считает, что его нужно перерисовать (например, потому что рисунки вашего приложения были проигнорированы, потому что экран был заблокирован, и теперь пользователь разблокировал экран, и требуются текущие рисунки) .

Этот прямоугольник не имеет ничего общего с размером отрисовки вашего содержимого. Размер области, в которой нарисован ваш вид, контролируется его фреймом и границами, первые из которых обычно контролируются с помощью автоматического макета (т. Е. Объектов ограничения макета).

В общем, находясь в drawRect, вы смотрите на границы своего представления, чтобы получить весь прямоугольник для рисования. Параметр drawRect, с другой стороны, позволяет вам оптимизировать рисунок, чтобы перерисовать только те части, которые на самом деле измененный.

Кроме того, манипулировать иерархиями представлений и слоев изнутри drawRect - это вообще плохая идея. Механизм рисования UIView ожидает, что вы будете рисовать только текущее состояние вашего представления. Поскольку он рекурсивно просматривает список представлений и подпредставлений для вызова drawRect, изменение списка представлений или слоев может вызвать странные побочные эффекты, такие как пропуск представлений до следующей перерисовки.

Создавайте и добавляйте новые слои в свои методы изменения состояния или методы обработки событий и размещайте их с помощью автоматического макета или изнутри layoutSubviews.

за 0 против

Я узнал, что если я установил фрейм, который у меня есть как currentLayer, на новые границы, экран, на котором можно рисовать, будет соответствующим образом изменен.

Codelisting
Популярные категории
На заметку программисту