Мне нужно сделать блокировку рисунка для моего приложения. Пример, который я следую отсюда: http://blog.grio.com/2011/11/android-pattern-lock-on-iphone.htmlЗамок рисунка в iOS
Однако это полноэкранный замок. Мне нужно, чтобы блокировка шаблона отображалась только в части экрана, так как на моем экране также должны быть текстовые поля и кнопки. Я изменил некоторые координаты в нем и довел шаблон до одной четверти его размера.
Код, приведенный в примере, использует presentModalViewController:animated:
, что означает, что представление должно быть представлено в полноэкранном режиме. Что нужно сделать, чтобы представление НЕ отображалось в полноэкранном режиме? Кроме того, когда я портирование кода в новый проект с раскадровкой, я получаю исключение NSInvalidArgument:
непризнанного селектора посланного к экземпляру
DrawPattern:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
NSLog(@"drawrect...");
if (!_trackPointValue)
return;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 10.0);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat components[] = {0.5, 0.5, 0.5, 0.8};
CGColorRef color = CGColorCreate(colorspace, components);
CGContextSetStrokeColorWithColor(context, color);
CGPoint from;
UIView *lastDot;
for (UIView *dotView in _dotViews) {
from = dotView.center;
NSLog(@"drwaing dotview: %@", dotView);
NSLog(@"\tdrawing from: %f, %f", from.x, from.y);
if (!lastDot)
CGContextMoveToPoint(context, from.x, from.y);
else
CGContextAddLineToPoint(context, from.x, from.y);
lastDot = dotView;
}
CGPoint pt = [_trackPointValue CGPointValue];
NSLog(@"\t to: pt = %f, pt = %f", pt.x, pt.y);
CGContextAddLineToPoint(context, pt.x, pt.y);
CGContextStrokePath(context);
CGColorSpaceRelease(colorspace);
CGColorRelease(color);
_trackPointValue = nil;
}
- (void)clearDotViews {
[_dotViews removeAllObjects];
}
- (void)addDotView:(UIView *)view {
if (!_dotViews)
_dotViews = [NSMutableArray array];
[_dotViews addObject:view];
}
- (void)drawLineFromLastDotTo:(CGPoint)pt {
_trackPointValue = [NSValue valueWithCGPoint:pt];
[self setNeedsDisplay];
}
ViewController:
- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return NO;
}
- (void)lockEntered:(NSString*)key {
NSLog(@"key: %@", key);
if (![key isEqualToString:@"020508"]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Wrong pattern!"
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alertView show];
}
else
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)lockClicked:(id)sender {
DrawPatternViewController *lockVC = [[DrawPatternViewController alloc] init];
[lockVC setTarget:self withAction:@selector(lockEntered:)];
[self presentModalViewController:lockVC animated:YES];
}
Пожалуйста, помогите! !
Я удалил контроллер начального представления и просто набрал часть в методе нажатия кнопки в методе viewDidLoad элемента DrawPatternViewController. Также я взял эти методы из DrawLockPatterView (класс UIView), ответственный за рисование сетки 3x3 и вставив ее в DrawPatternViewController. Это позволило мне добавить текстовые поля к тому же представлению, что и блокировка шаблона. Но мои начальники сказали, что это неприемлемо. Сейчас я пытаюсь следовать вашему подходу. Но я не уверен, как действовать дальше. –
Должен ли я использовать addChildViewController? –
Ваш начальник сказал вам, что это неприемлемо, но не дает указания? Вы все еще нуждаетесь в подклассе UIView, если вы используете drawRect: и этот подкласс должен обрабатываться как текстовые поля, добавленные в качестве подсмотра и настроенные в контроллере. Использование контроллера дочернего представления позволяет вам управлять блокировкой отдельно в том месте, где оно используется (следовательно, лучше для повторного использования). – Wain