Skip to content

Need its swift implementation. #1

Description

@zeeshanhaider-devbatch

Hi there Ricky,

What you think about its Swift implementation?

enum SPIconPosition {
case SPIconPositionTop, SPIconPositionLeft, SPIconPositionBottom, SPIconPositionRight
}

class SPButton {

//CGFloat iconMargin;
//NSInteger iconPosition;
//CGSize iconSize; // default is

func commonInit() {
    self.iconSize = CGSizeZero
}

init(aDecoder: NSCoder) {
    self = super(coder: aDecoder)
    if self {
        self.commonInit()
    }
    return self
}

init(frame: CGRect) {
    self = super(frame: frame)
    if self {
        self.commonInit()
    }
    return self
}

func titleRectForContentRect(contentRect: CGRect) -> CGRect {
    // clang diagnostic push
    // clang diagnostic ignored "-Wdeprecated"
    var size: CGSize = self.titleForState(self.state).sizeWithFont(self.font, constrainedToSize: contentRect.size)
    // clang diagnostic pop
    var iconSize: CGSize = CGSizeEqualToSize(self.iconSize, CGSizeZero) ? super.imageRectForContentRect(contentRect).size : self.iconSize
    var totalWidth: CGFloat = size.width+iconSize.width+self.iconMargin
    var totalHeight: CGFloat = size.height+iconSize.height+self.iconMargin
    var rect: CGRect = {
    switch self.contentHorizontalAlignment {
        case UIControlContentHorizontalAlignmentLeft:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
            case .Left:

            rect.origin.x = CGRectGetMinX(contentRect)+totalWidth-size.width
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
        }
        break
        case UIControlContentHorizontalAlignmentRight:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMaxX(contentRect)-totalWidth
            break
            case .Left:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
            default:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
        }
        break
        case UIControlContentHorizontalAlignmentFill:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
            case .Left:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-size.width)/2
            break
        }
        break
        default:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-totalWidth)/2
            break
            case .Left:

            rect.origin.x = CGRectGetMinX(contentRect)+CGRectGetWidth(contentRect)-(CGRectGetWidth(contentRect)-totalWidth)/2-size.width
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-size.width)/2
            break
        }
        break
    }
    switch self.contentVerticalAlignment {
        case UIControlContentVerticalAlignmentTop:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMinY(contentRect)+totalHeight-size.height
            break
            case .Bottom:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
        }
        break
        case UIControlContentVerticalAlignmentBottom:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
            case .Bottom:

            rect.origin.y = CGRectGetMaxY(contentRect)-totalHeight
            break
            default:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
        }
        break
        case UIControlContentVerticalAlignmentFill:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
            case .Bottom:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-size.height)/2
            break
        }
        break
        default:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMaxY(contentRect)-(CGRectGetHeight(contentRect)-totalHeight)/2-size.height
            break
            case .Bottom:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-totalHeight)/2
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-size.height)/2
            break
        }
        break
    }
    return rect
}

func imageRectForContentRect(contentRect: CGRect) -> CGRect {
    var size: CGSize = CGSizeEqualToSize(self.iconSize, CGSizeZero) ? super.imageRectForContentRect(contentRect).size : self.iconSize
    var titleSize: CGSize = self.titleRectForContentRect(contentRect).size
    switch _iconPosition {
        case .Top:

        case .Bottom:

        size.height = MAX(MIN(CGRectGetHeight(contentRect)-self.iconMargin-titleSize.height, size.height), self.iconSize.height)
        break
        default:

        size.width = MAX(MIN(CGRectGetWidth(contentRect)-self.iconMargin-titleSize.width, size.width), self.iconSize.width)
        break
    }
    var totalWidth: CGFloat = size.width+titleSize.width+self.iconMargin
    var totalHeight: CGFloat = size.height+titleSize.height+self.iconMargin
    var rect: CGRect = {
    switch self.contentHorizontalAlignment {
        case UIControlContentHorizontalAlignmentLeft:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMinX(contentRect)+totalWidth-size.width
            break
            case .Left:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
        }
        break
        case UIControlContentHorizontalAlignmentRight:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
            case .Left:

            rect.origin.x = CGRectGetMaxX(contentRect)-totalWidth
            break
            default:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
        }
        break
        case UIControlContentHorizontalAlignmentFill:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMaxX(contentRect)-size.width
            break
            case .Left:

            rect.origin.x = CGRectGetMinX(contentRect)
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-size.width)/2
            break
        }
        break
        default:

        switch _iconPosition {
            case .Right:

            rect.origin.x = CGRectGetMinX(contentRect)+CGRectGetWidth(contentRect)-(CGRectGetWidth(contentRect)-totalWidth)/2-size.width
            break
            case .Left:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-totalWidth)/2
            break
            default:

            rect.origin.x = CGRectGetMinX(contentRect)+(CGRectGetWidth(contentRect)-size.width)/2
            break
        }
        break
    }
    switch self.contentVerticalAlignment {
        case UIControlContentVerticalAlignmentTop:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
            case .Bottom:

            rect.origin.y = CGRectGetMinY(contentRect)+totalHeight-size.height
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
        }
        break
        case UIControlContentVerticalAlignmentBottom:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMaxY(contentRect)-totalHeight
            break
            case .Bottom:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
            default:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
        }
        break
        case UIControlContentVerticalAlignmentFill:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMinY(contentRect)
            break
            case .Bottom:

            rect.origin.y = CGRectGetMaxY(contentRect)-size.height
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-size.height)/2
            break
        }
        break
        default:

        switch _iconPosition {
            case .Top:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-totalHeight)/2
            break
            case .Bottom:

            rect.origin.y = CGRectGetMaxY(contentRect)-(CGRectGetHeight(contentRect)-totalHeight)/2-size.height
            break
            default:

            rect.origin.y = CGRectGetMinY(contentRect)+(CGRectGetHeight(contentRect)-size.height)/2
            break
        }
        break
    }
    return rect
}

func intrinsicContentSize() -> CGSize {
    var contentRect: CGRect = self.contentRectForBounds(self.bounds)
    // clang diagnostic push
    // clang diagnostic ignored "-Wdeprecated"
    var titleSize: CGSize = self.titleForState(self.state).sizeWithFont(self.font)
    // clang diagnostic pop
    var imageSize: CGSize = CGSizeEqualToSize(self.iconSize, CGSizeZero) ? super.imageRectForContentRect(contentRect).size : self.iconSize
    switch _iconPosition {
        case .Top:

        case .Bottom:

        return CGSizeMake(MAX(titleSize.width, imageSize.width), titleSize.height+imageSize.height+self.iconMargin)
        break
        default:

        return CGSizeMake(titleSize.width+imageSize.width+self.iconMargin, MAX(titleSize.height, imageSize.height))
        break
    }
}

func sizeThatFits(size: CGSize) -> CGSize {
    return self.intrinsicContentSize()
}

}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions