2013-05-21 22 views
5

Vì vậy, tôi đang cố gắng để animate một số hạn chế bố trí và đang gặp khốn khổ may mắn, tôi chỉ không nhìn thấy bất cứ điều gì và sau đó tôi nhận được một thông báo lỗi nói rằng nó như thế nào không thể đồng thời đáp ứng tất cả ép, vvcó lập trình NSLayoutConstraint vấn đề hoạt hình

Tôi đang sử dụng một lớp được gọi là PullableView có hoạt ảnh đang sử dụng kiểu cũ [UIView commitAnimation] vì vậy tôi đã phân loại nó và thêm vào mã của tôi cho những gì tôi tin là dành cho các ràng buộc sinh động ... Không may mắn và cố gắng làm động hoặc thậm chí làm cho nó hoạt động nhiều của bất cứ điều gì chứng minh được khó khăn tôi chỉ nhận được "Không thể đồng thời đáp ứng những hạn chế" .. Vấn đề là tôi khá mới để kinh doanh hạn chế này vì vậy tôi sẽ không biết bắt đầu từ đâu.

đây là lỗi khác là khá nhiều giống nhau nhưng đối với trung tâm.

"<NSLayoutConstraint:0x7c8a3a0 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX>", "<NSLayoutConstraint:0x7c6b480 StyledPullableView:0x905a9b0.centerX == UIView:0x9054680.centerX + 128>"

tôi dĩ nhiên làm [pullRightView setTranslatesAutoresizingMaskIntoConstraints:NO]; trước khi gọi này

bất kỳ sự giúp đỡ đánh giá cao.

- (void)setOpenedForConstraints:(BOOL)op animated:(BOOL)anim 
{ 
    opened = op; 

    if (anim) 
    {   
     NSLayoutConstraint *constraintX = [NSLayoutConstraint constraintWithItem:self 
                       attribute:NSLayoutAttributeCenterX 
                       relatedBy:NSLayoutRelationEqual 
                        toItem:_parentView 
                       attribute:NSLayoutAttributeCenterX 
                       multiplier:1 
                       constant:0]; 

     NSLayoutConstraint *constraintY = [NSLayoutConstraint constraintWithItem:self 
                       attribute:NSLayoutAttributeCenterY 
                       relatedBy:NSLayoutRelationEqual 
                        toItem:_parentView 
                       attribute:NSLayoutAttributeCenterY 
                       multiplier:1 
                       constant:0]; 

     [_parentView addConstraint:constraintX]; 
     [_parentView addConstraint:constraintY]; 

     constraintX.constant = opened ? self.openedCenter.x : self.closedCenter.x; 
     constraintY.constant = opened ? self.openedCenter.y : self.closedCenter.y; 
    } 

    if (anim) 
    { 

     // For the duration of the animation, no further interaction with the view is permitted 
     dragRecognizer.enabled = NO; 
     tapRecognizer.enabled = NO; 

     //[UIView commitAnimations]; 

     [UIView animateWithDuration:animationDuration 
         animations:^ 
     { 
      [self layoutIfNeeded]; 
     }]; 

    } 
    else 
    { 

     if ([delegate respondsToSelector:@selector(pullableView:didChangeState:)]) 
     { 
      [delegate pullableView:self didChangeState:opened]; 
     } 
    } 
} 

Trả lời

11

Một vài suy nghĩ:

  1. Bạn đang tạo trở ngại mới đây. Nói chung, bạn sẽ điều chỉnh constant của một ràng buộc hiện có. Hoặc, nếu cần thiết, bạn sẽ xóa ràng buộc cũ và thêm ràng buộc mới.

  2. Khi thay đổi hạn chế hiện tại, có hai cách tiếp cận. Một là lặp lại thông qua các ràng buộc của khung nhìn, tìm ra một ràng buộc trong câu hỏi, và sau đó điều chỉnh constant cho điều đó. Cách tiếp cận khác (và dễ dàng hơn nhiều khi khung nhìn mà bạn thêm vào trong Interface Builder) là tạo ra một IBOutlet cho quyền hạn chế trong Bộ dựng giao diện. Sau đó, bạn có thể tạo hiệu ứng đó.

    • This answer, trong khi tập trung vào một vấn đề khác, minh họa quá trình tạo ra một IBOutlet cho một hạn chế và sau đó tạo hiệu ứng động sự thay đổi giá trị của nó.

    • Nếu bạn phải lặp qua các ràng buộc tìm kiếm các ràng buộc (ví dụ: chọn một ràng buộc trong toàn bộ tập hợp mà bạn có thể đã tạo bằng ngôn ngữ định dạng hình ảnh), thì replaceLeadingAndTopWithCenterConstraints minh họa trong this answer có thể là ví dụ hữu ích về cách bạn tìm thấy một ràng buộc trên một khung nhìn hiện có. Ví dụ cụ thể này là loại bỏ một ràng buộc và thêm một ràng buộc mới, nhưng bạn có thể, cũng dễ dàng như vậy, một khi bạn tìm thấy ràng buộc hiện có, điều chỉnh hằng số của nó.


Tôi không hoàn toàn chắc chắn về UX bạn đang đi kiếm, nhưng giả sử bạn có một bảng điều khiển bạn muốn trượt ra phía bên trái của màn hình:

  1. Vấn đề đầu tiên là những hạn chế bạn đã xác định: Trong ví dụ này, tôi có bốn ràng buộc được xác định, ba ràng buộc (cụ thể là trên, dưới và bên trái, nhưng không phải bên phải) và giới hạn chiều rộng . Và nếu bạn đang làm điều này trong IB, nó có thể là khó tính (ví dụ: bạn không thể loại bỏ ràng buộc đúng cho đến khi bạn thêm ràng buộc chiều rộng).Chỉ cần đảm bảo rằng các ràng buộc được xác định đầy đủ, nhưng tối thiểu như vậy.

  2. Sau đó, tôi có thể làm động trượt của bảng điều khiển tắt màn hình chỉ bằng cách thay đổi constant của ràng buộc trái:

    - (IBAction)touchUpInsideButton:(id)sender 
    { 
        self.offscreen = !self.offscreen; 
    
        [UIView animateWithDuration:0.5 
            animations:^{ 
             self.panelLeftConstraint.constant = ([self isOffscreen] ? -kHowMuchToSlideOffToLeft : 0.0); 
             [self.view layoutIfNeeded]; 
            }]; 
    } 
    
  3. Bạn có thể thấy bây giờ tại sao điều quan trọng là để đảm bảo rằng không có ngay ràng buộc được xác định. Bởi vì nếu tôi điều chỉnh ràng buộc trái trong khi tôi có một ràng buộc chiều rộng một ràng buộc đúng được xác định, thì nó sẽ trở thành không thỏa mãn. Bằng cách đảm bảo các ràng buộc được xác định tối thiểu (mặc dù được định nghĩa rõ ràng) ngay từ đầu, tôi có thể thay đổi ràng buộc trái và khung nhìn bây giờ hoạt hình như tôi muốn nó.

+0

Cảm ơn câu trả lời, tôi sẽ nghiên cứu kỹ ... Tôi cũng loại bỏ tất cả các ràng buộc trước khi thêm ... ... – Genhain

+1

@Genhain Tôi nghĩ rằng đó là dễ dàng hơn nhiều để thay đổi các ràng buộc hơn là thêm và loại bỏ. Và hãy cẩn thận với những ràng buộc mà bạn đã xác định cho chế độ xem ở vị trí đầu tiên. Ví dụ, nếu tôi định trượt nó sang bên trái, tôi đã định nghĩa nó với đỉnh, đáy, trái và chiều rộng (nhưng không đúng!), Và sau đó tôi có thể tạo hiệu ứng động bằng cách thay đổi hằng số của ràng buộc trái . Xem câu trả lời đã sửa đổi. Tôi phải thú nhận rằng tôi đã không thể giải mã những gì UX mong muốn của bạn là từ mẫu mã của bạn, vì vậy nếu bạn làm rõ những gì bạn đang cố gắng để thực hiện, tôi có thể hữu ích hơn. – Rob

+0

Câu trả lời hay, nhưng điểm 2 trong danh sách đầu tiên của bạn là sai. Chỉ layoutIfNeeded phải nằm trong khối hoạt ảnh. – jrturton

Các vấn đề liên quan