рисование изображения в cameraOverlayView

#ios #objective-c

#iOS #цель-c

Вопрос:

Я использую этот код для создания UIImagePickerController с пользовательским cameraOverlayView интерфейсом. В целях тестирования наложение должно быть просто окружностью, которую я рисую в CircleView, используя UIBezierPath . Однако круг, нарисованный в CircleView, не отображается в наложении. Предполагается, что наложение должно быть подклассом UIView, которым является мой CircleView. Можете ли вы объяснить, почему круг не появляется при появлении наложения? Я инициализирую CircleView в viewDidLoad , а затем устанавливаю его в cameraOverlayView качестве in viewDidAppear .

ViewController ( Контроллер просмотра)

 @property (strong, nonatomic) CircleView *overlay;
 

viewDidLoad загрузить

 self.overlay = [[CircleView alloc] init];
 

viewDidAppear появиться

     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        UIImagePickerController *picker = [[UIImagePickerController alloc] init];

        picker.delegate = self;
        picker.allowsEditing = YES;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        picker.showsCameraControls = NO;
        picker.navigationBarHidden = YES;
        picker.wantsFullScreenLayout = YES;
        picker.cameraOverlayView = self.overlay;
        picker.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];

        [self presentViewController:picker animated:YES completion:NULL];
    }
 

Круговой обзор

 - (id)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super initWithCoder:aDecoder]) {

        self.shape = [UIBezierPath bezierPathWithOvalInRect:(CGRectMake(0, 50, 50, 50))];


    }
    return self;
}


- (void)drawRect:(CGRect)rect{

  [[UIColor colorWithRed: (114/255.0) green: (5/255.0) blue:(46/255.0) alpha:1] setFill];
   [self.shape fill];


}
 

Ответ №1:

Здесь есть две проблемы:

  • Ваш вид наложения круга имеет нулевой размер, потому что вы создаете его с init помощью вместо initWithFrame: ( init возвращается к кадру из {0,0,0,0} , поскольку вы не предоставили никакой информации о кадре).
  • Ваш вид наложения круга выполняет некоторую важную инициализацию initWithCoder: , но этот метод никогда не вызывается, поскольку вместо этого вы создаете его экземпляр init . Таким образом , его self.shape значение равно нулю , и в нем ничего не нарисовано drawRect: .

Комментарии:

1. хорошо, спасибо, поскольку вы никогда не должны вызывать initWithCoder напрямую, я был в недоумении, что делать. Я попробовал это initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, self.view.bounds.size.height)]; , и теперь у меня есть только черный слой, начинающийся с координаты y 50 вниз по экрану.

2. хорошо, проблема с черным экраном решена, self.overlay.opaque = NO; но не могли бы вы сказать мне, как я могу запустить initWithCoder в приведенном выше коде? или вы бы просто нарисовали круг внутри initWithFrame (что на самом деле работает, но я думал, что вы не должны были этого делать)?

3. Почему вы хотите «вызвать initWithCoder: ? У вас нет программиста; вы не разархивируетесь. Вы создаете экземпляр с нуля. Что касается рисования, вы бы рисовали drawRect: так же, как вы это делаете.