2014-11-12 3 views
0

У меня есть UIView, и я добавляю много UIImageView s (пример 5, число является динамическим) в качестве подзонов. все UIImageViews добавлены с NSLayoutConstraint (sizeToFit и центр, связанный с центром SuperView). Все связанные с центром ограничения добавляются к UIView (родительский вид).update NSLayoutConstaint view с UIPanGesture

У каждого UIImageView есть panGesture. поэтому, когда я перемещаю UIImageView, необходимо обновить связанное с центром ограничение этого UIImageView.

Вопрос,

Как определить ограничения движущаяся UIImageView?

(мне нужно сохранить ссылку всех созданных ограничений или есть ли другой способ сделать это?)

Edit: Мой обходной

Благодаря @Lord Жолт для ответа , Я написал код ниже (решение моей проблемы). это может помочь другим, у кого такая же проблема.

определяет как Globale переменных

NSLayoutConstraint *selectedImageViewCenterXconstraint, *selectedImageViewCenterYconstraint; 

то метод выбора UIPanGestureRecognizer является:

-(void)moveImageView:(UIPanGestureRecognizer *)recognizer{ 

    UIImageView *senderView = (UIImageView*)recognizer.view; 

    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     selectedImageViewCenterXconstraint = nil; 
     selectedImageViewCenterYconstraint = nil; 
     NSArray *viewConstraints = self.view.constraints; 
     for (NSLayoutConstraint *constraint in viewConstraints) { 
      if ([constraint.firstItem isEqual:senderView]) { 
       if (constraint.firstAttribute == NSLayoutAttributeCenterX) { 
        NSLog(@"gotCenterX"); 
        selectedImageViewCenterXconstraint = constraint; 
       }else if (constraint.firstAttribute == NSLayoutAttributeCenterY) { 
        NSLog(@"gotCenterY"); 
        selectedImageViewCenterYconstraint = constraint; 
       } 
      } 

      if (selectedImageViewCenterXconstraint && selectedImageViewCenterYconstraint) { 
       break; 
      } 
     } 
    } 


    CGPoint translation = [recognizer translationInView:senderView.superview]; 

    CGFloat newXconst,newYconst; 
    newXconst = selectedImageViewCenterXconstraint.constant + translation.x; 
    newYconst = selectedImageViewCenterYconstraint.constant + translation.y; 

    selectedImageViewCenterXconstraint.constant = newXconst; 
    selectedImageViewCenterYconstraint.constant = newYconst; 
    [self.view layoutIfNeeded]; 

    [recognizer setTranslation:CGPointMake(0, 0) inView:senderView.superview]; 
} 
+0

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

ответ

3

UIView подклассы имеют свойство constraints, который дает Вам NSArray, содержащее ограничение, добавленное на эту точку зрения.

Вы можете найти свое ограничение в этом массиве и подтвердить его либо firstItem, либо lastItem - ваш UIImageView.

Пример кода:

//Assuming self is a view controller. 
NSArray *constraints = [self.view constraints]; 
for (NSLayoutConstraint *constraint in constraints) { 
    if (constraint.firstItem == myImageView || 
     constraint.secondItem == myImageView) { 
     NSLog(@"Constraint belongs to myImageView"); 
    } 
} 
+0

спасибо. понял. – paran