From dd5955d872efb0b4ce46e06f1bf40106d9e5d6ad Mon Sep 17 00:00:00 2001 From: Copilot Date: Tue, 9 Dec 2025 11:49:59 +0100 Subject: [PATCH 1/2] [Foundation] Fix nullability in NSLayoutConstraint. This is file 37 of 47 files with nullability disabled in Foundation. Changes: - Enabled nullability - Fixed typos in file header ("palattable" -> "palatable", "INc" -> "Inc") - Added proper XML documentation for all public members, replacing "To be added" placeholders - Replaced include directives with inline documentation from NSLayoutConstraint.xml - Made return types nullable where appropriate (AsNumber, FirstAnchor, SecondAnchor) - Made view2 parameter nullable in Create method - Added ArgumentNullException.ThrowIfNull checks for format and viewsAndMetrics parameters - Removed all four [SupportedOSPlatform] attributes from FirstAnchor and SecondAnchor methods (none contained version numbers) - Added see cref attributes for better documentation cross-referencing - Fixed XML formatting and removed unnecessary whitespace Contributes towards https://github.com/dotnet/macios/issues/17285. --- docs/api/UIKit/NSLayoutConstraint.xml | 45 ------------ src/Foundation/NSLayoutConstraint.cs | 99 +++++++++++++++------------ 2 files changed, 57 insertions(+), 87 deletions(-) diff --git a/docs/api/UIKit/NSLayoutConstraint.xml b/docs/api/UIKit/NSLayoutConstraint.xml index 23cd25c31edf..ad03150f3679 100644 --- a/docs/api/UIKit/NSLayoutConstraint.xml +++ b/docs/api/UIKit/NSLayoutConstraint.xml @@ -31,25 +31,6 @@ var tconstraint1 = NSLayoutConstraint.Create (toolbar, NSLayoutAttribute.Width, Apple documentation for NSLayoutConstraint - - Visual format to use to create the constraints. - options. - - Pairs of names and values. The names should be strings (or NSStrings) and the values should be either UIViews, numbers (any C# number or NSNumber) or  instances that are suitable to be passed to the underlying engine.  - - -  This binds the provided name with the view or binds the name with the number as a metric. - - Factory method for creating a constraint using Visual Format Language. - An array of layout constraints that are suitable to be added to a using method. - - - - - - Constraints to activate. Activates all of the constraints passed. @@ -93,32 +74,6 @@ NSLayoutConstraint.ActivateConstraints(blueConstraints); It is easier to use the overload as it combines support for both metrics and views in a single call. - - First view in the constraint. - Attribute for the first view. - Relationships between the and the . - - Second view in the constraint. - This parameter can be . - This parameter can be . - - Attribute for the second view. - Multiplier applied to the second attribute. - Constants to add. - Factory method for creating a constraint. - - New constraint with the specified parameters. - - - - - Creates a constraint relationship between the and the that satisfies the following linear equation: - - - - = x + - - First view in the constraint. Attribute for the first view. diff --git a/src/Foundation/NSLayoutConstraint.cs b/src/Foundation/NSLayoutConstraint.cs index 0361bd73c801..90251c86e771 100644 --- a/src/Foundation/NSLayoutConstraint.cs +++ b/src/Foundation/NSLayoutConstraint.cs @@ -1,10 +1,10 @@ // -// Helper functions to make FromVisualLayout more palattable +// Helper functions to make FromVisualFormat more palatable // // Author: // Miguel de Icaza // -// Copyright 2014 Xamarin INc +// Copyright 2014 Xamarin Inc // #if MONOMAC @@ -13,8 +13,7 @@ using View = UIKit.UIView; #endif -// Disable until we get around to enable + fix any issues. -#nullable disable +#nullable enable #if MONOMAC namespace AppKit @@ -23,7 +22,7 @@ namespace UIKit #endif { public partial class NSLayoutConstraint { - static NSNumber AsNumber (object o) + static NSNumber? AsNumber (object o) { if (o is NSNumber) return (NSNumber) o; if (o is double) return new NSNumber ((double) o); @@ -42,10 +41,26 @@ static NSNumber AsNumber (object o) return null; } - /// + /// Factory method for creating a constraint using Visual Format Language. + /// Visual format to use to create the constraints. + /// Options for the format. + /// + /// Pairs of names and values. The names should be strings (or ) and the values should be either s, numbers (any C# number or ) or instances that are suitable to be passed to the underlying engine. + /// This binds the provided name with the view or binds the name with the number as a metric. + /// + /// An array of layout constraints that are suitable to be added to a using the method. + /// + /// + /// + /// + /// static public NSLayoutConstraint [] FromVisualFormat (string format, NSLayoutFormatOptions formatOptions, params object [] viewsAndMetrics) { - NSMutableDictionary views = null, metrics = null; + ArgumentNullException.ThrowIfNull (format); + ArgumentNullException.ThrowIfNull (viewsAndMetrics); + NSMutableDictionary? views = null, metrics = null; var count = viewsAndMetrics.Length; if (count != 0) { if ((count % 2) != 0) @@ -102,60 +117,60 @@ static public NSLayoutConstraint [] FromVisualFormat (string format, NSLayoutFor return FromVisualFormat (format, formatOptions, metrics, views); } - /// To be added. - /// To be added. - /// To be added. - /// To be added. - /// To be added. - /// Static factory method for creating a constraint. - /// To be added. - /// To be added. + /// Factory method for creating a constraint. + /// The view or object in the constraint. + /// The attribute for the view. + /// The relationship in the constraint. + /// The multiplier applied to the attribute. + /// The constant value in the constraint. + /// A new constraint with the specified parameters. + /// Creates a constraint for a single view with a specified attribute, relation, multiplier, and constant value. public static NSLayoutConstraint Create (NSObject view1, NSLayoutAttribute attribute1, NSLayoutRelation relation, nfloat multiplier, nfloat constant) { return NSLayoutConstraint.Create (view1, attribute1, relation, null, NSLayoutAttribute.NoAttribute, multiplier, constant); } - /// To be added. - /// To be added. - /// To be added. - /// Static factory method to create a constraint based on a , an , and an . - /// To be added. - /// To be added. + /// Factory method to create a constraint based on a , an , and an . + /// The view or object in the constraint. + /// The attribute for the view. + /// The relationship in the constraint. + /// A new constraint with the specified parameters and default multiplier (1.0) and constant (0.0). + /// Creates a constraint for a single view with default multiplier and constant values. public static NSLayoutConstraint Create (NSObject view1, NSLayoutAttribute attribute1, NSLayoutRelation relation) { return NSLayoutConstraint.Create (view1, attribute1, relation, null, NSLayoutAttribute.NoAttribute, 1.0f, 0f); } - // This solves the duplicate selector export problem while not breaking the API. - /// + /// Factory method for creating a constraint. + /// First view in the constraint. + /// Attribute for the first view. + /// Relationship between the and the . + /// Second view in the constraint. This parameter can be . + /// Attribute for the second view. + /// Multiplier applied to the second attribute. + /// Constant to add. + /// A new constraint with the specified parameters. + /// Creates a constraint relationship between the and the that satisfies the following linear equation: = x + . public static NSLayoutConstraint Create (NSObject view1, NSLayoutAttribute attribute1, NSLayoutRelation relation, - NSObject view2, NSLayoutAttribute attribute2, nfloat multiplier, nfloat constant) + NSObject? view2, NSLayoutAttribute attribute2, nfloat multiplier, nfloat constant) { return Create ((INativeObject) view1, attribute1, relation, view2, attribute2, multiplier, constant); } - /// To be added. - /// For an anchor-based constraint, returns the first anchor, properly downcast to AnchorType. - /// To be added. - /// To be added. - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [SupportedOSPlatform ("tvos")] - [SupportedOSPlatform ("macos")] - public NSLayoutAnchor FirstAnchor () where AnchorType : NSObject + /// For an anchor-based constraint, returns the first anchor, properly downcast to . + /// The type of anchor to return. + /// The first anchor of the constraint, cast to the specified anchor type. + /// This method is useful for retrieving the first anchor when working with anchor-based constraints. + public NSLayoutAnchor? FirstAnchor () where AnchorType : NSObject { return Runtime.GetNSObject> (_FirstAnchor ()); } - /// To be added. - /// For an anchor-based constraint, returns the second anchor, properly downcast to AnchorType. - /// To be added. - /// To be added. - [SupportedOSPlatform ("ios")] - [SupportedOSPlatform ("maccatalyst")] - [SupportedOSPlatform ("tvos")] - [SupportedOSPlatform ("macos")] - public NSLayoutAnchor SecondAnchor () where AnchorType : NSObject + /// For an anchor-based constraint, returns the second anchor, properly downcast to . + /// The type of anchor to return. + /// The second anchor of the constraint, cast to the specified anchor type. + /// This method is useful for retrieving the second anchor when working with anchor-based constraints. + public NSLayoutAnchor? SecondAnchor () where AnchorType : NSObject { return Runtime.GetNSObject> (_SecondAnchor ()); } From 43da3aaf17e0262fdebebb955d75d3ff17cdef50 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 15 Dec 2025 10:03:00 +0100 Subject: [PATCH 2/2] Update src/Foundation/NSLayoutConstraint.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Foundation/NSLayoutConstraint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Foundation/NSLayoutConstraint.cs b/src/Foundation/NSLayoutConstraint.cs index 90251c86e771..fac7a430c1aa 100644 --- a/src/Foundation/NSLayoutConstraint.cs +++ b/src/Foundation/NSLayoutConstraint.cs @@ -52,7 +52,7 @@ public partial class NSLayoutConstraint { /// /// /// /// ///