// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_SHARED_UI_UTIL_NAMED_GUIDE_H_
#define IOS_CHROME_BROWSER_SHARED_UI_UTIL_NAMED_GUIDE_H_
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/shared/ui/util/layout_guide_names.h"
// A UILayoutGuide subclass that represents the layout of a well-known piece of
// UI. See layout_guide_names.h for a list of the UI components for which named
// guides are created.
@interface NamedGuide : UILayoutGuide
// Designated initializer for a guide with `name`.
- (instancetype)initWithName:(GuideName*)name NS_DESIGNATED_INITIALIZER;
// NamedGuides must be created using `-initWithName:`.
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
// Returns the NamedGuide with the given `name`, if one is attached to `view`
// or one of `view`'s ancestors. If no guide is found, returns nil.
+ (instancetype)guideWithName:(GuideName*)name view:(UIView*)view;
// Resets `constrainedView` and `constrainedFrame`, deactivating constraints
// that were created to support following the view/frame. Note that calling
// this function has no effect on constraints that were created outside of this
// class. `isConstrained` will return NO after calling this function.
- (void)resetConstraints;
// The GuideName passed on initialization.
@property(nonatomic, readonly) GuideName* name;
// Whether this NamedGuide is constrained to either a view or frame (using
// `constrainedView` or `constrainedFrame`, respectively).
@property(nonatomic, readonly, getter=isConstrained) BOOL constrained;
// The view to which this guide should be constrained. Setting this property
// to a new value will update the guide's constraints to match the new view.
// Setting to nil removes constraints. Setting this property to a non-nil value
// will reset `constrainedFrame` to CGRectNull.
@property(nonatomic, weak) UIView* constrainedView;
// The frame to which this guide should be constrained, in the guide's owning
// view's coordinate system. This can be used to specify locations that don't
// correspond with a particular view, or correspond to views in different
// windows. Setting this property to a new value will update the guide's
// constraints to match the specified frame according to `autoresizingMask`.
// Setting to CGRectNull removes constraints. Setting this property to a non-
// CGRectNull value will reset `constrainedView` to nil. If `constrainedView`
// is removed from `owningView`'s hierarchy, this property will be reset to nil.
@property(nonatomic, assign) CGRect constrainedFrame;
// The autoresizing behavior to use when setting up constraints for
// `constrainedFrame`. This property has no effect if `constrainedFrame` is
// CGRectNull.
@property(nonatomic, assign) UIViewAutoresizing autoresizingMask;
@end
#endif // IOS_CHROME_BROWSER_SHARED_UI_UTIL_NAMED_GUIDE_H_