Подкласс UIView: drawRect не вызывается - PullRequest
13 голосов
/ 31 марта 2012

Я новичок в программировании на iOS, поэтому извините, если мой вопрос глупый.

Я пытаюсь создать приложение, которое выполняет произвольное рисование загруженного изображения.

Для этого я обнаружил, что решение состоит в том, чтобы создать подкласс UIView и отредактировать метод drawRect.

Я сделал это для следующего кода, который активируется на IBAction, связанном с кнопкой в ​​файле раскадровки Interface Builder.

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:     @"SampleImage.jpg"]]; 
image.frame = previewView.frame;
[image setContentMode:UIViewContentModeScaleAspectFit];       

[previewView addSubview:image];

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)];
[previewView addSubview:aCustomView];

customView - это созданный мной подкласс UIView, чьи методы init и drawRect установлены следующим образом:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    NSLog(@"INITIALIZING");
    if (self) {
        // Initialization code
        [self setBackgroundColor:[UIColor clearColor]];
    }
    return self;
}


- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    NSLog(@"DRAWING");

    CGContextClearRect(ctx, rect);

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3);
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1);
    CGContextSetLineWidth(ctx, 2);
    CGContextStrokeEllipseInRect(ctx, rect);
}

Проблема, с которой я столкнулся, заключается в том, что я не рисую, и на NSLog у меня есть сообщение «ИНИЦИАЛИЗАЦИЯ», но нет рисунка «ЧЕРТЕЖ».

Так что в основном он создает initWithFrame, но не вызывает метод drawRect.

Не могли бы вы указать мне, что я делаю не так?

Ответы [ 3 ]

17 голосов
/ 08 мая 2013
  1. Убедитесь, что ваш новый класс представления является подклассом UIView, а не UIImageView.
  2. Чтобы убедиться, что новый вид отображается, вам нужно сделать [viewContainer addSubView:] , чтобы вызвать drawRect для вызова.

Ссылка на документ:

Класс UIImageView оптимизирован для отрисовки его изображений на дисплее. UIImageView не будет вызывать drawRect: подкласс. Если вашему подклассу требуется пользовательский код для рисования, рекомендуется использовать UIView в качестве базового класса.

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

8 голосов
/ 05 апреля 2012

Paolo,

Вот несколько вещей, которые вы можете попробовать:

  1. в initWithFrame, убедитесь, что переменная frame содержит то, что вы ожидал бы это: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Попробуйте позвонить [preview setNeedsDisplay]; после добавления его в суперпредставление

Наконец, я бы изменил

image.frame = previewView.frame;

с:

image.bounds = CGRectMake (0, 0, previewView.frame.size.width, previewView.frame.size.height);

3 голосов
/ 01 декабря 2014

Может быть, вопрос в том, что фрейм CustomView (0,0,0,0).
Вы можете попытаться передать постоянный параметр CGRect, например: CGRectMake(5, 5, 100, 100)。

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...