2014-02-20 3 views
0

У меня есть объект, созданный из класса UIView для создания неограниченного количества просмотров, которые затем отображаются в меньших размерах в середине экрана. Я использовал UITapGestureRecognizer, чтобы увеличить одно из представлений, чтобы соответствовать экрану, но проблема здесь в том, что объект доступен только в первом классе и не может быть передан второму классу, который является селектором. Каковы ваши предложения по этой конкретной проблеме? Как я могу отправить свой объект в селектор, чтобы использовать его там? СпасибоЕсть ли способ отправить объект через UITapGestureRecognizer?

Вот первый класс, который создает объект (производный от iCarousel):

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 
{ 
    UILabel *label = nil; 
    UIButton *close = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 


    //create new view if no view is available for recycling 
    if (view == nil) 
    { 


     view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320.0f, 460.0f)]; 
     view.contentMode = UIViewContentModeCenter; 

     view.backgroundColor = [UIColor whiteColor]; 

     label = [[UILabel alloc] initWithFrame:CGRectMake(100, -100, 100, 100)]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textAlignment = NSTextAlignmentCenter; 
     label.font = [label.font fontWithSize:50]; 
     label.tag = 1; 
     [view addSubview:label]; 

     close.frame = CGRectMake(0, 0, 30, 30); 
     [close setTitle:@"x" forState:UIControlStateNormal]; 
     close.titleLabel.font = [UIFont systemFontOfSize:25]; 
     [close addTarget:self action:@selector(closeMe:) forControlEvents:UIControlEventTouchUpInside]; 

     [view addSubview:close]; 


     UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToMaximize:)]; 
     tap.numberOfTapsRequired = 1; 
     [view addGestureRecognizer:tap]; 

    } 
    else 
    { 

     //get a reference to the label in the recycled view 
     label = (UILabel *)[view viewWithTag:1]; 

    } 


    label.text = [items[index] stringValue]; 

    return view; 
} 

и селектор:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer { 

    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionCurveLinear 
        animations:^{ 
         carousel.transform = CGAffineTransformMakeScale(1, 1); 

        } 
        completion:^(BOOL finished) { 
        }]; 

} 

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

+0

Можете ли вы опубликовать код, показывающий, как вы это настроили? – Austin

ответ

0

UITapGestureRecognizer наследует view свойство от UIGestureRecognizer, которые вы можете использовать, чтобы увеличить только вид, что водопроводная жест распознаватель в:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer { 

    UIView *viewToMaximize; 
    if ([recognizer.view isEqual:_maximizedView]) { 
     viewToMaximize = nil; 
    } else { 
     viewToMaximize = recognizer.view; 
    } 
    UIView *viewToUnmaximize = _maximizedView; // _maximizedView should be an instance variable on your view controller 

    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionCurveLinear 
        animations:^{ 
         viewToMaximize.transform = CGAffineTransformMakeScale(1.1, 1.1); 
         viewToUnmaximize.transform = CGAffineTransformIdentity; 
        } 
        completion:^(BOOL finished) { 
        }]; 

    _maximizedView = viewToMaximize; 
} 

Кроме того, CGAffineTransformMakeScale(1, 1) будет масштабировать вид к исходному размеру, так что я толкал масштаб вверх в моем фрагменте кода.

+0

, если он пытается масштабировать карусель, тогда viewToMaximize не должен быть распознающим. Посмотрите здесь, это мнение, что жест привязан к - скорее всего, self.view. – bpercevic

+1

В конце сообщения @ user2828182 заявил, что он пытался масштабировать 'view' (к которому был прикреплен распознаватель жестов), * не * всю карусель. – Austin

+0

вы правы, я читал слишком быстро. Прости! – bpercevic

0

Если я правильно понимаю, вы хотите преобразовать UIView, который вы использовали, какова должна быть карусель?

Предполагая, что вы добавили кран жест распознаватель к self.view, то это, как вы получите представление, которое вы только повернутым на:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer 
{ 
    UIView *view = [self.view hitTest:[recognizer locationInView:self.view] withEvent:nil]; 
    // you can now check to see if this view is the carousel 
} 

После того, как вы знаете, является ли или не похлопал вас на карусели, вы можете хранить его, передавать его другому классу, преобразовывать его или что угодно.

+1

Спасибо, что вам нужно ответить, чтобы ответить на мой вопрос. Он работает, но если я увеличиваю один вид, он не возвращается к первоначальному размеру, как только я коснуюсь другого вида, чтобы увеличить его. Остин понял это правильно. Спасибо вам обоим. Действительно ценю это. – user2828182

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