Как переписать ограничение - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть UIButton, который ограничен родительским представлением, как это:

[myButton constrainToParentView:NSLayoutAttributeCenterX];

и позже в моем коде я хочу изменить ограничение на это:

[myButton constrainToParentView:NSLayoutAttributeLeading spaced:24];

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

1 Ответ

0 голосов
/ 16 февраля 2019

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

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

// SwapConstraintsViewController.h

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface SwapConstraintsViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

и

// SwapConstraintsViewController.m

#import "SwapConstraintsViewController.h"

@interface SwapConstraintsViewController ()

@property (strong, nonatomic) UIButton *myButton;

@property (strong, nonatomic) NSLayoutConstraint *centerXLayoutConstraint;
@property (strong, nonatomic) NSLayoutConstraint *leadingLayoutConstraint;

@end

@implementation SwapConstraintsViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _myButton = [UIButton new];
    _myButton.translatesAutoresizingMaskIntoConstraints = NO;
    _myButton.backgroundColor = [UIColor redColor];
    [_myButton setTitle:@"Test Button" forState:UIControlStateNormal];

    [self.view addSubview:_myButton];

    // constrain the button 100-pts from the top of the view
    [_myButton.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:100.0].active = YES;

    // create centerX constraint
    _centerXLayoutConstraint = [_myButton.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor constant:0.0];

    // create leading constraint
    _leadingLayoutConstraint = [_myButton.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:24.0];

    // activate centerX constraint
    _centerXLayoutConstraint.active = YES;

    [_myButton addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside];

}

- (void)didTap:(id)sender {

    if ([_centerXLayoutConstraint isActive]) {
        // de-activate center first, then activate leading
        _centerXLayoutConstraint.active = NO;
        _leadingLayoutConstraint.active = YES;
    } else {
        // de-activate leading first, then activate center
        _leadingLayoutConstraint.active = NO;
        _centerXLayoutConstraint.active = YES;
    }

}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...