2016-02-08 2 views
2

Я добавляю несколько жестов в одном представлении. В представлении есть одна кнопка закрытия в углу обзора. Все работает нормально, но когда я увеличиваю масштаб, кнопка просмотра с закрытием также увеличивает масштаб с этим видом. Теперь я хочу только масштабировать что не смотрите на ту кнопку закрытия, пожалуйста, предложите мне, как это сделать?Как предотвратить изменение размера кнопки при увеличении супер-просмотра?

см. Ниже изображение для справки.

enter image description here

Код для щепотку Увеличить

-(void)addStickersWithView:(UIView*)view image:(UIImage*)image{ 

    CGPoint center = self.imgPhoto.center; 
    UIImageView *imgView = [[UIImageView alloc] initWithImage:image]; 
    UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)]; 
    [imgView setContentMode:UIViewContentModeScaleToFill]; 
    UIView *viewZoom = [[UIView alloc] initWithFrame:CGRectMake(center.x-45,center.y-45, 90, 90)]; 
    // [viewZoom setBackgroundColor:[UIColor redColor]]; 
    imgView.frame = CGRectMake(5, 5, CGRectGetWidth(viewZoom.frame)-10, CGRectGetHeight(viewZoom.frame)-10); 
    [viewZoom addSubview:imgView]; 
    [viewZoom addGestureRecognizer:rotationGesture]; 

    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)]; 
    [pinchGesture setDelegate:self]; 
    [viewZoom addGestureRecognizer:pinchGesture]; 

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveImage:)]; 
    [panGesture setMinimumNumberOfTouches:1]; 
    [panGesture setMaximumNumberOfTouches:1]; 
    [viewZoom addGestureRecognizer:panGesture]; 

    UIButton *btnCloseSticker = [UIButton buttonWithType:UIButtonTypeCustom]; 

    [btnCloseSticker setBounds:CGRectMake(0, 0, 30,30)]; 
    [btnCloseSticker setImage:[UIImage imageNamed:@"close1.png"] forState:UIControlStateNormal]; 
    [btnCloseSticker addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    self.stickerCount++; 
    btnCloseSticker.tag = self.stickerCount; 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapToShowClose:)]; 
    tapGesture.numberOfTapsRequired = 2; 
    [viewZoom addGestureRecognizer:tapGesture]; 
    viewZoom.layer.borderColor = [UIColor whiteColor].CGColor; 
    viewZoom.layer.borderWidth = 3.0; 
    viewZoom.tag = self.stickerCount+kTagBorder; 
    [viewZoom addSubview:btnCloseSticker]; 

    [view addSubview:viewZoom]; 
} 

-(void)hideShowBorderCloseButton{ 
    int borderCount = self.stickerCount-kTagBorder; 
    for(int i=1;i<=borderCount;i++){ 
     UIView *view = [self.viewStickers viewWithTag:i+kTagBorder]; 
     UIView *view1 = [self.viewStickers viewWithTag:i+(kTagBorder*2)]; 
     view.hidden = YES; 
     view1.layer.borderWidth = 0.0; 
    } 
} 

-(void)buttonPressed:(id)sender{ 
    UIView *view = [sender superview]; 
    [view removeFromSuperview]; 
    self.stickerCount--; 
} 

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer { 
    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = [gestureRecognizer scale]; 
    } 
    UIButton *btn = [self.viewStickers viewWithTag:gestureRecognizer.view.tag-kTagBorder]; 
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
     [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

     // Constants to adjust the max/min values of zoom 
     const CGFloat kMaxScale = 3.0; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]); 
     newScale = MIN(newScale, kMaxScale/currentScale); 
     newScale = MAX(newScale, kMinScale/currentScale); 
     CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale); 
     [gestureRecognizer view].transform = transform; 

     lastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 
    } 
} 

-(void)TapToShowClose:(UITapGestureRecognizer *)gestureRecognizer{ 
    //int borderCount = self.stickerCount-kTagBorder; 

    UIView *view = gestureRecognizer.view; //cast pointer to the derived class if needed 
    view.layer.borderWidth = 2.0; 
    UIView *view1 = [self.viewStickers viewWithTag:view.tag-kTagBorder]; 
    [(UIButton*)view1 setImage:[UIImage imageNamed:@"close1.png"] forState:UIControlStateNormal]; 
    [view1 setBounds:CGRectMake(0, 0, 30,30)]; 

    view1.hidden = NO; 
} 

- (void)moveImage:(UIPanGestureRecognizer *)recognizer 
{ 
    CGPoint newCenter = [recognizer translationInView:self.view]; 
    [self hideShowBorderCloseButton]; 
if([recognizer state] == UIGestureRecognizerStateBegan) { 
     beginX = recognizer.view.center.x; 
     beginY = recognizer.view.center.y; 
    } 
    newCenter = CGPointMake(beginX + newCenter.x, beginY + newCenter.y); 

     [recognizer.view setCenter:newCenter]; 

} 


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    // if the gesture recognizers are on different views, don't allow simultaneous recognition 
    if (gestureRecognizer.view != otherGestureRecognizer.view) 
     return NO; 

    // if either of the gesture recognizers is the long press, don't allow simultaneous recognition 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
     return NO; 

    return YES; 
} 

- (void)rotatePiece:(UIRotationGestureRecognizer *)gestureRecognizer { 
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 
    [self hideShowBorderCloseButton]; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 
     [gestureRecognizer view].transform = CGAffineTransformRotate([[gestureRecognizer view] transform], [gestureRecognizer rotation]); 
     [gestureRecognizer setRotation:0]; 
    } 
} 
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    [self hideShowBorderCloseButton]; 

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     UIView *piece = gestureRecognizer.view; 
     CGPoint locationInView = [gestureRecognizer locationInView:piece]; 
     CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; 

     piece.layer.anchorPoint = CGPointMake(locationInView.x/piece.bounds.size.width, locationInView.y/piece.bounds.size.height); 
     piece.center = locationInSuperview; 
    } 
} 
+0

просьба сообщить код –

+0

Моего вопроса не связанные с кодом .. Я добавляю щепотку масштабирование и его работает нормально, но не хочу, чтобы увеличить кнопку закрытия с точкой зрения, как это сделать? –

+0

Извините, приятель его очень трудно понять, что не так, не видя логики. Во всяком случае, должно быть что-то, что вы должны были сделать при масштабировании, что сделало близкое увеличение кнопки. Иначе этого не должно быть. –

ответ

1

Вместо масштабирования. это тесто для расчета кадра с вашим уровнем масштабирования. и обновить рамку представления. ознакомьтесь с приведенным ниже способом.

- (IBAction)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer { 
    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = [gestureRecognizer scale]; 
    } 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
     [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]); 
     [self changeScale:newScale]; 

     lastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 
    } 
} 

-(void)changeScale :(float)newScale{ 

    CGAffineTransform transform = CGAffineTransformScale([viewForpinch transform], newScale, newScale); 
    viewForpinch.transform = transform; 

    float scale = viewForpinch.transform.a; 
    float buttonScale = 1/scale; 

    btnl.transform= CGAffineTransformScale(CGAffineTransformIdentity, buttonScale, buttonScale); 


} 
+0

его не работает гладко .. :( –

+0

вы установили минимальный и максимальный размер? –

+0

да, на самом деле я реализовал более одного жестов, таких как поворот, движение, щепотку, вот почему это не работает гладко, но с моим выше кодом все –

0

Самый простой способ сделать это, чтобы удалить кнопку закрытия с этой точки зрения, и добавить его на вершине зрения вы зумирование с другой вид.

Вы можете использовать. insertSubview:aboveSubview:

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