#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:
так же, как вы это делаете.