activateConstraints: and deactivateConstraints: not persisting after rotation for constraints created in IB

前端 未结 3 486
遥遥无期
遥遥无期 2020-12-05 13:41

The new NSLayoutConstraint methods activateConstraints: and deactivateConstraints: don\'t appear to work correctly with IB-created con

3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-05 14:11

    The problem is that you are doing something incoherent with "uninstalled" constraints in the storyboard. They are there but not there. "Uninstalled" constraints are for use only with size classes! You use them if you are going to let Xcode swap constraints for you automatically on rotation. Xcode can't cope with what you're doing. But if you create the second set of constraints in code, everything will work fine.

    So, do this. Delete the two "uninstalled" constraints, and delete the uninstalledConstraints outlet. Now replace your entire view controller code with this:

    @property (strong, nonatomic) NSMutableArray *c1;
    @property (strong, nonatomic) NSMutableArray *c2;
    @property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *installedConstraints;
    @property (weak,nonatomic) IBOutlet UIButton *button;
    @end
    
    @implementation ViewController {
        BOOL did;
    }
    
    - (void)viewDidLayoutSubviews {
        NSLog(@"did");
        if (!did) {
            did = YES;
            self.c1 = [self.installedConstraints mutableCopy];
            self.c2 = [NSMutableArray new];
            [self.c2 addObject:
             [NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1 constant:30]];
            [self.c2 addObject:
             [NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeadingMargin multiplier:1 constant:30]];
        }
    }
    
    - (IBAction)switchconstraints:(UIButton *)sender {
        [NSLayoutConstraint deactivateConstraints:self.c1];
        [NSLayoutConstraint activateConstraints:self.c2];
        NSMutableArray* temp = self.c1;
        self.c1 = self.c2;
        self.c2 = temp;
    }
    

    Now repeatedly press the button. As you see, it jumps between the two positions. Now rotate the app; the button stays where it is.

提交回复
热议问题