Вы пытаетесь смешать и сопоставить явные настройки рамки / границ с ограничениями автоматического макета. Это, как вы видите, не сработает.
Когда вы запустите эту строку:
[[recognizer view] setBounds:CGRectMake(100, 100, bounds.size.width, bounds.size.height)];
Вы изменяете bounds
представления. Это не меняет никаких ограничений. (На самом деле, установка bounds
даже не меняет frame
, но это другая проблема.)
Если вы хотите переместить представление и сохранить ограничения между этим представлением и другими элементами, вам необходимо обновить ограничения для этого представления, а не для его границ (или фрейма) .
Таким образом, вы хотите сохранить ссылки на ограничения или найти их при необходимости и обновить значения .constant
по желанию.
Вот пример изменения центра вашего постукивающего вида путем нахождения ограничений CenterX и CenterY (вместо сохранения ссылок):
- (void)handleGesture:(UIGestureRecognizer*)recognizer
{
// get the view that was tapped
UIView *tappedView = [recognizer view];
// get that view's constraints
NSArray *constraints = [tappedView constraints];
// we want to find the CenterX constraint
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeCenterX];
NSArray *filteredArray = [constraints filteredArrayUsingPredicate:predicate];
// if it doesn't have a CenterX constraint, return
if(filteredArray.count == 0){
return;
}
NSLayoutConstraint *centerX = [filteredArray objectAtIndex:0];
// we want to find the CenterY constraint
predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeCenterY];
filteredArray = [constraints filteredArrayUsingPredicate:predicate];
// if it doesn't have a CenterY constraint, return
if(filteredArray.count == 0){
return;
}
NSLayoutConstraint *centerY = [filteredArray objectAtIndex:0];
// we now have references to the CenterX and CenterY constraints of the tapped view,
// so we can change the .constant values and the related constraints to the other view will be maintained
[UIView animateWithDuration:0.15
animations:^
{
centerX.constant -= 100.0;
centerY.constant -= 100.0;
}
completion:^(BOOL finished)
{
}];
}