2017-05-09 10 views
0

iPhoneまたはiPadで良好な視覚的結果を得るために制約を使用してUIAlertController内にprogressViewを配置しようとしました。iOS - progressViewを使用してUIAlertControllerに制約を設定できません

alert = [UIAlertController 
      alertControllerWithTitle:title 
      message:message 
      preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction* cancelButton = [UIAlertAction 
           actionWithTitle:titleCancel 
           style:UIAlertActionStyleDefault 
           handler:cancelBlock]; 


    [alert addAction:cancelButton]; 


    UIProgressView* progressView = [[UIProgressView alloc] init]; 
    progressView.progress = 0.0; 
    progressView.tintColor = UIColor.blueColor; 
    [alert.view addSubview:progressView]; 


    UILayoutGuide *margin = alert.view.layoutMarginsGuide; 
    [alert.view setAutoresizingMask:UIViewAutoresizingNone]; 
    [progressView.heightAnchor constraintEqualToConstant:5].active = YES; 
    [progressView.widthAnchor constraintEqualToAnchor:margin.widthAnchor multiplier:0.75].active = YES; 
    [progressView.centerXAnchor constraintEqualToAnchor:margin.centerXAnchor].active = YES; 
    [progressView.centerYAnchor constraintEqualToAnchor:margin.centerYAnchor].active = YES; 

    [self presentViewController:alert animated:YES completion:nil]; 

私は(...一例であり、QUE紫色の四角がsupuse alertViewControllerである)このような何かを達成したい: enter image description here

これは私がやっているログです...間違っている...なぜ制約との競合があるのですか?

2017-05-09 18:17:28.657982 Myapp[1457:1442554] [Common] _BSMachError: port a0a3; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND" 
2017-05-09 18:17:28.659300 Myapp[1457:1442554] [Common] _BSMachError: port a0a3; (os/kern) invalid name (0xf) "Unable to deallocate send right" 
2017-05-09 18:17:28.709082 Myapp[1457:1442554] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x17048be00 h=--& v=--& UIProgressView:0x1013a44b0.height == 2 (active)>", 
    "<NSLayoutConstraint:0x17449cb60 UIProgressView:0x1013a44b0.height == 5 (active)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x17449cb60 UIProgressView:0x1013a44b0.height == 5 (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2017-05-09 18:17:28.712681 Myapp[1457:1442554] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x170490310 h=--& v=--& UIProgressView:0x1013a44b0.midY == 1 (active)>", 
    "<NSLayoutConstraint:0x17449fef0 UIView:0x1013a56e0.height >= 44 (active)>", 
    "<NSLayoutConstraint:0x17449b2b0 _UIAlertControllerView:0x1013a5a40'Myapp'.height == UIView:0x1013a56e0.height (active)>", 
    "<NSLayoutConstraint:0x174681e50 UIProgressView:0x1013a44b0.centerY == UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.centerY (active)>", 
    "<NSLayoutConstraint:0x174681e00 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide']-(8)-| (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>", 
    "<NSLayoutConstraint:0x174681bd0 'UIView-topMargin-guide-constraint' V:|-(8)-[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'] (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x17449fef0 UIView:0x1013a56e0.height >= 44 (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2017-05-09 18:17:28.715180 Myapp[1457:1442554] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x170490310 h=--& v=--& UIProgressView:0x1013a44b0.midY == 1 (active)>", 
    "<NSLayoutConstraint:0x174681e50 UIProgressView:0x1013a44b0.centerY == UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.centerY (active)>", 
    "<NSLayoutConstraint:0x174681bd0 'UIView-topMargin-guide-constraint' V:|-(8)-[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'] (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x174681e50 UIProgressView:0x1013a44b0.centerY == UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.centerY (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2017-05-09 18:17:28.717844 Myapp[1457:1442554] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x170490f40 h=--& v=--& UIProgressView:0x1013a44b0.midX == 0 (active)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x170495270 h=--& v=--& UIProgressView:0x1013a44b0.width == 0 (active)>", 
    "<NSLayoutConstraint:0x174681db0 UIProgressView:0x1013a44b0.width == 0.75*UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.width (active)>", 
    "<NSLayoutConstraint:0x174681f40 UIProgressView:0x1013a44b0.centerX == UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.centerX (active)>", 
    "<NSLayoutConstraint:0x174681c20 'UIView-leftMargin-guide-constraint' H:|-(8)-[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x174681f40 UIProgressView:0x1013a44b0.centerX == UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.centerX (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2017-05-09 18:17:28.720158 Myapp[1457:1442554] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x170495270 h=--& v=--& UIProgressView:0x1013a44b0.width == 0 (active)>", 
    "<NSLayoutConstraint:0x170288840 UIView:0x1013a56e0.width == 270 (active)>", 
    "<NSLayoutConstraint:0x174499eb0 _UIAlertControllerView:0x1013a5a40'Myapp'.width >= UIView:0x1013a56e0.width (active)>", 
    "<NSLayoutConstraint:0x174681db0 UIProgressView:0x1013a44b0.width == 0.75*UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'.width (active)>", 
    "<NSLayoutConstraint:0x174681c20 'UIView-leftMargin-guide-constraint' H:|-(8)-[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>", 
    "<NSLayoutConstraint:0x174681f90 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x174389170'UIViewLayoutMarginsGuide']-(8)-|(LTR) (active, names: '|':_UIAlertControllerView:0x1013a5a40'Myapp')>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x170288840 UIView:0x1013a56e0.width == 270 (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

は 'UIAlertController'をカスタマイズするように設計されていません。 – rmaddy

答えて

0

まず、進捗状況ビューに制約を追加することは良い考えではないと思います。表示されているUIAlertControllerに追加されているためです。

progressviewを追加する場合は、進行状況を追跡し、メインスレッドで実行する必要がある進行状況を更新する必要があります。そのため、重い操作が行われるたびにUI更新(進行)に影響する可能性があります。これはアプローチの下にはGCD

によって適切に処理する必要がありますあなたがAlertviewControllerのビューに対する制約を設定しないでください、あなたの問題

dispatch_async(dispatch_get_main_queue(), ^{ 
UIAlertController * alertCont = [UIAlertController alertControllerWithTitle:@"Test" message:@"Test message" preferredStyle:UIAlertControllerStyleAlert]; 

    UIProgressView * progresbar = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault]; 
    [progresbar setProgress:5.0 animated:YES]; 
    progresbar.frame = CGRectMake(10, 40, 250, 0); 
    [alertCont.view addSubview:progresbar]; 
    [topController presentViewController:alertCont animated:YES completion:nil]; 
}); 
+0

このアプローチの問題は、マジックナンバーの使用です。さらに、iPadやランドスケープではうまく機能しません – Ricardo

0

への解決策を達成するのに役立ちます。代わりに、AlertviewController - > View - > Subviews [0]を使用して制約を設定します。

例えば、UIAlertControllerの幅を設定する:

for constraint in self.alertView.subviews[0].constraints { 
    if constraint.firstAttribute == NSLayoutAttribute.width && constraint.constant == 270{ 
    NSLayoutConstraint.deactivate([constraint]) 
    break 
    } 
} 

let widthConstraint:NSLayoutConstraint = NSLayoutConstraint(item: self.view.subviews[0], attribute: 
    NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 120.0) 

self.alertview.subviews[0].addConstraint(widthConstraint) 
関連する問題