2013-05-09 5 views
1

Мне нужно сделать блокировку рисунка для моего приложения. Пример, который я следую отсюда: 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]; 
} 

Пожалуйста, помогите! !

ответ

0

Вам нужно добавить свой «замок» в качестве дополнительного представления в виде других текстовых полей и перенести управляющий код на контроллер вида, который контролирует это представление. Тогда у вас не будет контроллера вида, который нужно нажать.

Технически вы могли бы добавить контроллер представлений «lock vies» в качестве контроллера детского представления (лучше для повторного использования в будущем). В этом случае «lock view» по-прежнему добавляется как дополнительный вид представления с другими текстовыми полями.

+0

Я удалил контроллер начального представления и просто набрал часть в методе нажатия кнопки в методе viewDidLoad элемента DrawPatternViewController. Также я взял эти методы из DrawLockPatterView (класс UIView), ответственный за рисование сетки 3x3 и вставив ее в DrawPatternViewController. Это позволило мне добавить текстовые поля к тому же представлению, что и блокировка шаблона. Но мои начальники сказали, что это неприемлемо. Сейчас я пытаюсь следовать вашему подходу. Но я не уверен, как действовать дальше. –

+0

Должен ли я использовать addChildViewController? –

+1

Ваш начальник сказал вам, что это неприемлемо, но не дает указания? Вы все еще нуждаетесь в подклассе UIView, если вы используете drawRect: и этот подкласс должен обрабатываться как текстовые поля, добавленные в качестве подсмотра и настроенные в контроллере. Использование контроллера дочернего представления позволяет вам управлять блокировкой отдельно в том месте, где оно используется (следовательно, лучше для повторного использования). – Wain

Смежные вопросы