# ChatLayoutDelegate

    public protocol ChatLayoutDelegate : AnyObject

`CollectionViewChatLayout` delegate

- `shouldPresentHeader(_:at:)` Default implementation

  `CollectionViewChatLayout` will call this method to ask if it should present the header in the current layout.

  #### Default Implementation

  Default implementation returns: `false`.

  #### Declaration

  Swift

      func shouldPresentHeader(_ chatLayout: CollectionViewChatLayout,
                               at sectionIndex: Int) -> Bool

  #### Parameters

  `chatLayout` | `CollectionViewChatLayout` reference.
  `sectionIndex` | Index of the section.

  #### Return Value

  `Bool`.

- `shouldPresentFooter(_:at:)` Default implementation

  `CollectionViewChatLayout` will call this method to ask if it should present the footer in the current layout.

  #### Default Implementation

  Default implementation returns: `false`.

  #### Declaration

  Swift

      func shouldPresentFooter(_ chatLayout: CollectionViewChatLayout,
                               at sectionIndex: Int) -> Bool

  #### Parameters

  `chatLayout` | `CollectionViewChatLayout` reference.
  `sectionIndex` | Index of the section.

  #### Return Value

  `Bool`.

- `sizeForItem(_:of:at:)` Default implementation

  `CollectionViewChatLayout` will call this method to ask what size the item should have.

  NB:

  If you are trying to speed up the layout process by returning exact item sizes in this method - do not forget to change `UICollectionReusableView.preferredLayoutAttributesFitting(...)` method and do not call `super.preferredLayoutAttributesFitting(...)` there as it will measure the `UIView` using Autolayout Engine anyway.

  #### Default Implementation

  Default implementation returns: `ItemSize.auto`.

  #### Declaration

  Swift

      func sizeForItem(_ chatLayout: CollectionViewChatLayout,
                       of kind: ItemKind,
                       at indexPath: IndexPath) -> ItemSize

  #### Parameters

  `chatLayout` | `CollectionViewChatLayout` reference.
  `kind` | Type of element represented by `ItemKind`.
  `indexPath` | Index path of the item.

  #### Return Value

  `ItemSize`.

- `alignmentForItem(_:of:at:)` Default implementation

  `CollectionViewChatLayout` will call this method to ask what type of alignment the item should have.

  #### Default Implementation

  Default implementation returns: `ChatItemAlignment.fullWidth`.

  #### Declaration

  Swift

      func alignmentForItem(_ chatLayout: CollectionViewChatLayout,
                            of kind: ItemKind,
                            at indexPath: IndexPath) -> ChatItemAlignment

  #### Parameters

  `chatLayout` | `CollectionViewChatLayout` reference.
  `kind` | Type of element represented by `ItemKind`.
  `indexPath` | Index path of the item.

  #### Return Value

  `ChatItemAlignment`.

- `initialLayoutAttributesForInsertedItem(_:of:at:modifying:on:)` Default implementation

  Asks the delegate to modify a layout attributes instance so that it represents the initial visual state of an item being inserted.

  The `originalAttributes` instance is a reference type, and therefore can be modified directly.

  #### Default Implementation

  Default implementation sets a `ChatLayoutAttributes.alpha` to zero.

  #### Declaration

  Swift

      func initialLayoutAttributesForInsertedItem(_ chatLayout: CollectionViewChatLayout,
                                                  of kind: ItemKind,
                                                  at indexPath: IndexPath,
                                                  modifying originalAttributes: ChatLayoutAttributes,
                                                  on state: InitialAttributesRequestType)

- `finalLayoutAttributesForDeletedItem(_:of:at:modifying:)` Default implementation

  Asks the delegate to modify a layout attributes instance so that it represents the final visual state of an item being removed via `UICollectionView.deleteSections(_:)`.

  The `originalAttributes` instance is a reference type, and therefore can be modified directly.

  #### Default Implementation

  Default implementation sets a `ChatLayoutAttributes.alpha` to zero.

  #### Declaration

  Swift

      func finalLayoutAttributesForDeletedItem(_ chatLayout: CollectionViewChatLayout,
                                               of kind: ItemKind,
                                               at indexPath: IndexPath,
                                               modifying originalAttributes: ChatLayoutAttributes)

- `interItemSpacing(_:of:after:)` Default implementation

  Returns the interval between items. If returns `nil` - the value from `ChatLayoutSettings` will be used.

  #### Default Implementation

  Default implementation returns: `nil`.

  #### Declaration

  Swift

      func interItemSpacing(_ chatLayout: CollectionViewChatLayout,
                            of kind: ItemKind,
                            after indexPath: IndexPath) -> CGFloat?

- `interSectionSpacing(_:after:)` Default implementation

  Returns the interval between sections. If returns `nil` - the value from `ChatLayoutSettings` will be used.

  #### Default Implementation

  Default implementation returns: `nil`.

  #### Declaration

  Swift

      func interSectionSpacing(_ chatLayout: CollectionViewChatLayout,
                               after sectionIndex: Int) -> CGFloat?