0

I have tried to place the progressView inside UIAlertController using constraints in order to get a good visual result on iPhone or iPad.

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];

I want to achieve something like this(que purple square is supuse the alertViewController, is just an example...): enter image description here

This is the logs... what I'm doing wrong... why are there conflicts with constraints?

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.
Ricardo
  • 7,921
  • 14
  • 64
  • 111

2 Answers2

0

First of all, I don't think adding constraints to progress view is a good idea. Since it is added to the UIAlertController which is presented.

If you are adding a progressView, You need to track the progress and update the Progress which needs to be done on the main thread, So every time any heavy operation is going on it might affect the UI Update(progress). This has to be handled properly by GCD

Below approach will help to achieve solution to your problem

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];
});
  • The problem with this approach is the use of magic numbers. Plus, this not working well on iPad or landscape – Ricardo May 10 '17 at 07:38
0

You should not set constraints relative to AlertviewController's view. Instead use AlertviewController -> View -> Subviews[0] to set constraint.

For example, to set width of 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)
HeadOnn
  • 1,480
  • 14
  • 21