//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
#[cfg(feature = "objc2-core-foundation")]
use objc2_core_foundation::*;
use objc2_foundation::*;
#[cfg(feature = "objc2-quartz-core")]
#[cfg(not(target_os = "watchos"))]
use objc2_quartz_core::*;
#[cfg(feature = "objc2-symbols")]
use objc2_symbols::*;

use crate::*;

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/uikit/uiimageview?language=objc)
    #[unsafe(super(UIView, UIResponder, NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(all(feature = "UIResponder", feature = "UIView"))]
    pub struct UIImageView;
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UIView",
    feature = "objc2-quartz-core"
))]
#[cfg(not(target_os = "watchos"))]
extern_conformance!(
    unsafe impl CALayerDelegate for UIImageView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSCoding for UIImageView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSObjectProtocol for UIImageView {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearance for UIImageView {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearanceContainer for UIImageView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UICoordinateSpace for UIImageView {}
);

#[cfg(all(
    feature = "UIDynamicBehavior",
    feature = "UIResponder",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UIDynamicItem for UIImageView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusEnvironment for UIImageView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItem for UIImageView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItemContainer for UIImageView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIResponderStandardEditActions for UIImageView {}
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UITraitCollection",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UITraitEnvironment for UIImageView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UIImageView {
    extern_methods!(
        #[cfg(feature = "UIImage")]
        #[unsafe(method(initWithImage:))]
        #[unsafe(method_family = init)]
        pub fn initWithImage(this: Allocated<Self>, image: Option<&UIImage>) -> Retained<Self>;

        #[cfg(feature = "UIImage")]
        #[unsafe(method(initWithImage:highlightedImage:))]
        #[unsafe(method_family = init)]
        pub fn initWithImage_highlightedImage(
            this: Allocated<Self>,
            image: Option<&UIImage>,
            highlighted_image: Option<&UIImage>,
        ) -> Retained<Self>;

        #[cfg(feature = "UIImage")]
        #[unsafe(method(image))]
        #[unsafe(method_family = none)]
        pub fn image(&self) -> Option<Retained<UIImage>>;

        #[cfg(feature = "UIImage")]
        /// Setter for [`image`][Self::image].
        #[unsafe(method(setImage:))]
        #[unsafe(method_family = none)]
        pub fn setImage(&self, image: Option<&UIImage>);

        #[cfg(feature = "UIImage")]
        #[unsafe(method(highlightedImage))]
        #[unsafe(method_family = none)]
        pub fn highlightedImage(&self) -> Option<Retained<UIImage>>;

        #[cfg(feature = "UIImage")]
        /// Setter for [`highlightedImage`][Self::highlightedImage].
        #[unsafe(method(setHighlightedImage:))]
        #[unsafe(method_family = none)]
        pub fn setHighlightedImage(&self, highlighted_image: Option<&UIImage>);

        #[cfg(all(
            feature = "UIImageConfiguration",
            feature = "UIImageSymbolConfiguration"
        ))]
        #[unsafe(method(preferredSymbolConfiguration))]
        #[unsafe(method_family = none)]
        pub fn preferredSymbolConfiguration(&self) -> Option<Retained<UIImageSymbolConfiguration>>;

        #[cfg(all(
            feature = "UIImageConfiguration",
            feature = "UIImageSymbolConfiguration"
        ))]
        /// Setter for [`preferredSymbolConfiguration`][Self::preferredSymbolConfiguration].
        #[unsafe(method(setPreferredSymbolConfiguration:))]
        #[unsafe(method_family = none)]
        pub fn setPreferredSymbolConfiguration(
            &self,
            preferred_symbol_configuration: Option<&UIImageSymbolConfiguration>,
        );

        #[unsafe(method(isUserInteractionEnabled))]
        #[unsafe(method_family = none)]
        pub fn isUserInteractionEnabled(&self) -> bool;

        /// Setter for [`isUserInteractionEnabled`][Self::isUserInteractionEnabled].
        #[unsafe(method(setUserInteractionEnabled:))]
        #[unsafe(method_family = none)]
        pub fn setUserInteractionEnabled(&self, user_interaction_enabled: bool);

        #[unsafe(method(isHighlighted))]
        #[unsafe(method_family = none)]
        pub fn isHighlighted(&self) -> bool;

        /// Setter for [`isHighlighted`][Self::isHighlighted].
        #[unsafe(method(setHighlighted:))]
        #[unsafe(method_family = none)]
        pub fn setHighlighted(&self, highlighted: bool);

        #[cfg(feature = "UIImage")]
        #[unsafe(method(animationImages))]
        #[unsafe(method_family = none)]
        pub fn animationImages(&self) -> Option<Retained<NSArray<UIImage>>>;

        #[cfg(feature = "UIImage")]
        /// Setter for [`animationImages`][Self::animationImages].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setAnimationImages:))]
        #[unsafe(method_family = none)]
        pub fn setAnimationImages(&self, animation_images: Option<&NSArray<UIImage>>);

        #[cfg(feature = "UIImage")]
        #[unsafe(method(highlightedAnimationImages))]
        #[unsafe(method_family = none)]
        pub fn highlightedAnimationImages(&self) -> Option<Retained<NSArray<UIImage>>>;

        #[cfg(feature = "UIImage")]
        /// Setter for [`highlightedAnimationImages`][Self::highlightedAnimationImages].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setHighlightedAnimationImages:))]
        #[unsafe(method_family = none)]
        pub fn setHighlightedAnimationImages(
            &self,
            highlighted_animation_images: Option<&NSArray<UIImage>>,
        );

        #[unsafe(method(animationDuration))]
        #[unsafe(method_family = none)]
        pub fn animationDuration(&self) -> NSTimeInterval;

        /// Setter for [`animationDuration`][Self::animationDuration].
        #[unsafe(method(setAnimationDuration:))]
        #[unsafe(method_family = none)]
        pub fn setAnimationDuration(&self, animation_duration: NSTimeInterval);

        #[unsafe(method(animationRepeatCount))]
        #[unsafe(method_family = none)]
        pub fn animationRepeatCount(&self) -> NSInteger;

        /// Setter for [`animationRepeatCount`][Self::animationRepeatCount].
        #[unsafe(method(setAnimationRepeatCount:))]
        #[unsafe(method_family = none)]
        pub fn setAnimationRepeatCount(&self, animation_repeat_count: NSInteger);

        #[cfg(feature = "UIColor")]
        #[unsafe(method(tintColor))]
        #[unsafe(method_family = none)]
        pub fn tintColor(&self) -> Option<Retained<UIColor>>;

        #[cfg(feature = "UIColor")]
        /// Setter for [`tintColor`][Self::tintColor].
        ///
        /// # Safety
        ///
        /// `tint_color` might not allow `None`.
        #[unsafe(method(setTintColor:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setTintColor(&self, tint_color: Option<&UIColor>);

        #[unsafe(method(startAnimating))]
        #[unsafe(method_family = none)]
        pub fn startAnimating(&self);

        #[unsafe(method(stopAnimating))]
        #[unsafe(method_family = none)]
        pub fn stopAnimating(&self);

        #[unsafe(method(isAnimating))]
        #[unsafe(method_family = none)]
        pub fn isAnimating(&self) -> bool;

        #[cfg(feature = "UIInterface")]
        /// The preferred treatment to use for HDR images. By default the image view will defer to the value from its traitCollection.
        #[unsafe(method(preferredImageDynamicRange))]
        #[unsafe(method_family = none)]
        pub fn preferredImageDynamicRange(&self) -> UIImageDynamicRange;

        #[cfg(feature = "UIInterface")]
        /// Setter for [`preferredImageDynamicRange`][Self::preferredImageDynamicRange].
        #[unsafe(method(setPreferredImageDynamicRange:))]
        #[unsafe(method_family = none)]
        pub fn setPreferredImageDynamicRange(
            &self,
            preferred_image_dynamic_range: UIImageDynamicRange,
        );

        #[cfg(feature = "UIInterface")]
        /// The resolved treatment to use for HDR images.
        #[unsafe(method(imageDynamicRange))]
        #[unsafe(method_family = none)]
        pub fn imageDynamicRange(&self) -> UIImageDynamicRange;

        #[unsafe(method(adjustsImageWhenAncestorFocused))]
        #[unsafe(method_family = none)]
        pub fn adjustsImageWhenAncestorFocused(&self) -> bool;

        /// Setter for [`adjustsImageWhenAncestorFocused`][Self::adjustsImageWhenAncestorFocused].
        #[unsafe(method(setAdjustsImageWhenAncestorFocused:))]
        #[unsafe(method_family = none)]
        pub fn setAdjustsImageWhenAncestorFocused(&self, adjusts_image_when_ancestor_focused: bool);

        #[cfg(feature = "UILayoutGuide")]
        #[unsafe(method(focusedFrameGuide))]
        #[unsafe(method_family = none)]
        pub fn focusedFrameGuide(&self) -> Retained<UILayoutGuide>;

        #[unsafe(method(overlayContentView))]
        #[unsafe(method_family = none)]
        pub fn overlayContentView(&self) -> Retained<UIView>;

        #[unsafe(method(masksFocusEffectToContents))]
        #[unsafe(method_family = none)]
        pub fn masksFocusEffectToContents(&self) -> bool;

        /// Setter for [`masksFocusEffectToContents`][Self::masksFocusEffectToContents].
        #[unsafe(method(setMasksFocusEffectToContents:))]
        #[unsafe(method_family = none)]
        pub fn setMasksFocusEffectToContents(&self, masks_focus_effect_to_contents: bool);
    );
}

/// Methods declared on superclass `UIView`.
#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UIImageView {
    extern_methods!(
        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(initWithFrame:))]
        #[unsafe(method_family = init)]
        pub fn initWithFrame(this: Allocated<Self>, frame: CGRect) -> Retained<Self>;

        /// # Safety
        ///
        /// `coder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;
    );
}

/// Methods declared on superclass `NSObject`.
#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UIImageView {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UIImageView {
    extern_methods!(
        #[cfg(feature = "objc2-symbols")]
        /// Adds a symbol effect to the image view with default options and animation.
        #[unsafe(method(addSymbolEffect:))]
        #[unsafe(method_family = none)]
        pub fn addSymbolEffect(&self, symbol_effect: &NSSymbolEffect);

        #[cfg(feature = "objc2-symbols")]
        /// Adds a symbol effect to the image view with specified options and default animation.
        #[unsafe(method(addSymbolEffect:options:))]
        #[unsafe(method_family = none)]
        pub fn addSymbolEffect_options(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
        );

        #[cfg(feature = "objc2-symbols")]
        /// Adds a symbol effect to the image view with specified options and animation.
        #[unsafe(method(addSymbolEffect:options:animated:))]
        #[unsafe(method_family = none)]
        pub fn addSymbolEffect_options_animated(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
            animated: bool,
        );

        #[cfg(all(
            feature = "UISymbolEffectCompletion",
            feature = "block2",
            feature = "objc2-symbols"
        ))]
        /// Adds a symbol effect to the image view with specified options, animation, and completion handler.
        ///
        /// # Safety
        ///
        /// `completion_handler` must be a valid pointer or null.
        #[unsafe(method(addSymbolEffect:options:animated:completion:))]
        #[unsafe(method_family = none)]
        pub unsafe fn addSymbolEffect_options_animated_completion(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
            animated: bool,
            completion_handler: UISymbolEffectCompletion,
        );

        #[cfg(feature = "objc2-symbols")]
        /// Removes from the image view the symbol effect matching the type of effect passed in, with default options and animation.
        #[unsafe(method(removeSymbolEffectOfType:))]
        #[unsafe(method_family = none)]
        pub fn removeSymbolEffectOfType(&self, symbol_effect: &NSSymbolEffect);

        #[cfg(feature = "objc2-symbols")]
        /// Removes from the image view the symbol effect matching the type of effect passed in, with specified options and default animation.
        #[unsafe(method(removeSymbolEffectOfType:options:))]
        #[unsafe(method_family = none)]
        pub fn removeSymbolEffectOfType_options(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
        );

        #[cfg(feature = "objc2-symbols")]
        /// Removes from the image view the symbol effect matching the type of effect passed in, with specified options and animation.
        #[unsafe(method(removeSymbolEffectOfType:options:animated:))]
        #[unsafe(method_family = none)]
        pub fn removeSymbolEffectOfType_options_animated(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
            animated: bool,
        );

        #[cfg(all(
            feature = "UISymbolEffectCompletion",
            feature = "block2",
            feature = "objc2-symbols"
        ))]
        /// Removes from the image view the symbol effect matching the type of effect passed in, with specified options, animation, and completion handler.
        ///
        /// # Safety
        ///
        /// `completion_handler` must be a valid pointer or null.
        #[unsafe(method(removeSymbolEffectOfType:options:animated:completion:))]
        #[unsafe(method_family = none)]
        pub unsafe fn removeSymbolEffectOfType_options_animated_completion(
            &self,
            symbol_effect: &NSSymbolEffect,
            options: &NSSymbolEffectOptions,
            animated: bool,
            completion_handler: UISymbolEffectCompletion,
        );

        /// Removes all symbol effects from the image view with default options and animation.
        #[unsafe(method(removeAllSymbolEffects))]
        #[unsafe(method_family = none)]
        pub fn removeAllSymbolEffects(&self);

        #[cfg(feature = "objc2-symbols")]
        /// Removes all symbol effects from the image view with specified options and default animation.
        #[unsafe(method(removeAllSymbolEffectsWithOptions:))]
        #[unsafe(method_family = none)]
        pub fn removeAllSymbolEffectsWithOptions(&self, options: &NSSymbolEffectOptions);

        #[cfg(feature = "objc2-symbols")]
        /// Removes all symbol effects from the image view with specified options and animation.
        #[unsafe(method(removeAllSymbolEffectsWithOptions:animated:))]
        #[unsafe(method_family = none)]
        pub fn removeAllSymbolEffectsWithOptions_animated(
            &self,
            options: &NSSymbolEffectOptions,
            animated: bool,
        );

        #[cfg(all(feature = "UIImage", feature = "objc2-symbols"))]
        /// Sets the symbol image on the image view with a symbol content transition and default options.
        /// Passing in a non-symbol image will result in undefined behavior.
        #[unsafe(method(setSymbolImage:withContentTransition:))]
        #[unsafe(method_family = none)]
        pub fn setSymbolImage_withContentTransition(
            &self,
            symbol_image: &UIImage,
            transition: &NSSymbolContentTransition,
        );

        #[cfg(all(feature = "UIImage", feature = "objc2-symbols"))]
        /// Sets the symbol image on the image view with a symbol content transition and specified options.
        /// Passing in a non-symbol image will result in undefined behavior.
        #[unsafe(method(setSymbolImage:withContentTransition:options:))]
        #[unsafe(method_family = none)]
        pub fn setSymbolImage_withContentTransition_options(
            &self,
            symbol_image: &UIImage,
            transition: &NSSymbolContentTransition,
            options: &NSSymbolEffectOptions,
        );

        #[cfg(all(
            feature = "UIImage",
            feature = "UISymbolEffectCompletion",
            feature = "block2",
            feature = "objc2-symbols"
        ))]
        /// Sets the symbol image on the image view with a symbol content transition, options, and completion handler.
        /// Passing in a non-symbol image will result in undefined behavior.
        ///
        /// # Safety
        ///
        /// `completion_handler` must be a valid pointer or null.
        #[unsafe(method(setSymbolImage:withContentTransition:options:completion:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setSymbolImage_withContentTransition_options_completion(
            &self,
            symbol_image: &UIImage,
            transition: &NSSymbolContentTransition,
            options: &NSSymbolEffectOptions,
            completion_handler: UISymbolEffectCompletion,
        );
    );
}
