GithubHelp home page GithubHelp logo

rickytan / rticonbutton Goto Github PK

View Code? Open in Web Editor NEW
41.0 3.0 7.0 240 KB

A Interface Builder configurable UIButton with a image icon

License: MIT License

Ruby 4.25% Objective-C 95.75%
icon button uibutton icon-position alignment

rticonbutton's Introduction

RTIconButton

CI Status Version License Platform

This is a drop-in replacement for UIButton, which support convenient configuration for image icon's position and icon title margin.

It also support control centent aligns.

NOTE: To support IB, you must set use_frameworks! in your Podfile.

S1

Usage

  1. Drag and drop a UIButton to your controller
  2. set the Class to RTIconButton
  3. set the icon position, icon margin and icon size. If size is not specified, it will displayed in the image natural size.

S2

S3

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

  • UIKit
  • Xcode 6

Installation

RTIconButton is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "RTIconButton"

License

RTIconButton is available under the MIT license. See the LICENSE file for more info.

rticonbutton's People

Contributors

rickytan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

rticonbutton's Issues

Need its swift implementation.

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()
}

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.