Рисование методом drawRect - Какао

Я искал решения, но не могу понять, возможно ли сделать следующее:

У меня есть метод drawRect, что я хочу сделать, это добавить графический элемент (например, линии и линии) в текущее представление, не обновляя его. Раньше я вызывал setNeedsDisplay, но этот метод на самом деле удаляет myView, перерисовывая его с 0.. Есть ли какие-либо предложения сохранить старый и добавить новый контент?

Поблагодарить

6 ответов

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

Или вы можете позвонить setNeedsDisplayInRect: если вы хотите просто перерисовать определенный раздел вашего представления.

Вот что делает drawRect: делает - он перерисовывает прямоугольник в представлении.

Если вы хотите, чтобы линии и линии были нарисованы сверху, попробуйте сделать это на другом слое.

По умолчанию метод drawRect очищает весь контент, если вы хотите динамически нарисовать некоторое новое графическое содержимое в представлении, вам следует абстрагировать структуру данных этих графических элементов, например, вы добавляете строку, эта строка будет иметь

       начальная точка конечная точка цвет линии цвет линии имеет тень соединение линии

так что вы можете поместить все эти свойства в структуру и определить новый класс данных с именем LineStruct и определить метод с именем

   -(void)drawLine:(CGContextRef)ctx withLineStruct:(LineStruct*)lineStruct

в свой пользовательский UIView, определите

@property (nonatomic) LineStruct *lineStruct;

и вызвать в его методе drawRect

   -(void)drawRect:(CGContextRef)ctx{
      CGContextRef ctx = UIGraphicsGetCurrentContext() ;
      [self drawLine:ctx withLineStruct:self.lineStruct];
   }

так что если у вас есть другое графическое содержимое, вы можете сделать так. Если у вас много содержимого, вы должны добавить буфер в UIView, например, добавить NSArray, а в методе drawRect вы добавляете for(;;), чтобы нарисовать все графические элементы.

Полагаю, лучше работать со слоями. Вы можете создавать подклассы CALayer для ваших фигур, а затем сохранять их в массиве.

Вы можете "обойти" это, сделав вид, который вы хотите нарисовать, отдельно от вашего вида с оригинальными иблетами. Затем сделайте фон основного вида прозрачным (но не делайте iboutlets прозрачным). Поэтому в этом примере я не позволю, чтобы IBOutlets, которые вы хотите сохранить (не перерисовывать), были UITextField, UILabel и UIButton. Итак, ваш Interface Builder будет выглядеть так:

UIVIewController
  UIView2 (view with drawRect defined)
  UIView  (main)
    UITextField
    UILabel
    UIButton

Итак, как вы видите, когда вы вызываете 'drawRect', он все равно полностью очищает ваш UIView2, но это не имеет значения, потому что 'drawRect' не удалит ни один из UILabel, UIButton, UITextField или что-либо еще, что вы хотите сохранить в ваш UIView1. Надеюсь это поможет.

Я думаю, что вам может понадобиться что-то вроде NSBezierPath для хранения всех ваших фигур и добавления новых фигур. Легко добавить новые формы в существующий NSBezierPath, см. Документацию: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html Затем в вашем drawrect, вам нужно будет только обводить или заполнять NSBezierPath.

Это будет работать только в том случае, если все ваши фигуры имеют одинаковый цвет заливки и обводку. В противном случае вы можете сохранить какой-то список из нескольких NSBezierPath и по-разному их обводить / заполнять.

Другие вопросы по тегам