Skip to content

Commit

Permalink
Do the same with less code
Browse files Browse the repository at this point in the history
  • Loading branch information
JanGorman committed Aug 25, 2015
1 parent 322ed67 commit 75699a4
Show file tree
Hide file tree
Showing 4 changed files with 228 additions and 251 deletions.
2 changes: 1 addition & 1 deletion SwiftMessageBar.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = "SwiftMessageBar"
s.version = "1.0.5"
s.version = "1.0.6"
s.summary = "A Swift Message Bar"

s.description = <<-DESC
Expand Down
4 changes: 4 additions & 0 deletions SwiftMessageBar.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
F22ADD2E1B8CB23F00EBA839 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = F22ADD2D1B8CB23F00EBA839 /* Message.swift */; };
F2AB58E81B28B33C001DCC74 /* SwiftMessageBar.h in Headers */ = {isa = PBXBuildFile; fileRef = F2AB58E71B28B33C001DCC74 /* SwiftMessageBar.h */; settings = {ATTRIBUTES = (Public, ); }; };
F2AB58EE1B28B33D001DCC74 /* SwiftMessageBar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2AB58E21B28B33C001DCC74 /* SwiftMessageBar.framework */; };
F2AB58F51B28B33D001DCC74 /* SwiftMessageBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2AB58F41B28B33D001DCC74 /* SwiftMessageBarTests.swift */; };
Expand All @@ -33,6 +34,7 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
F22ADD2D1B8CB23F00EBA839 /* Message.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = "<group>"; };
F2AB58E21B28B33C001DCC74 /* SwiftMessageBar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftMessageBar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
F2AB58E61B28B33C001DCC74 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
F2AB58E71B28B33C001DCC74 /* SwiftMessageBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftMessageBar.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -94,6 +96,7 @@
F2AB58E71B28B33C001DCC74 /* SwiftMessageBar.h */,
F2AB58E51B28B33C001DCC74 /* Supporting Files */,
F2AB59391B28B45A001DCC74 /* SwiftMessageBar.swift */,
F22ADD2D1B8CB23F00EBA839 /* Message.swift */,
);
path = SwiftMessageBar;
sourceTree = "<group>";
Expand Down Expand Up @@ -249,6 +252,7 @@
buildActionMask = 2147483647;
files = (
F2AB593A1B28B45A001DCC74 /* SwiftMessageBar.swift in Sources */,
F22ADD2E1B8CB23F00EBA839 /* Message.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
207 changes: 207 additions & 0 deletions SwiftMessageBar/Message.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
//
// Created by Jan Gorman on 25/08/15.
// Copyright (c) 2015 Schnaub. All rights reserved.
//

import UIKit

internal protocol Identifiable {

func id() -> NSUUID

}

internal final class Message: UIView, Identifiable {

private static let Padding: CGFloat = 10
private static let MessageOffset: CGFloat = 2
private static let IconSize: CGFloat = 36

private let uuid = NSUUID()
private var title: String?
private var message: String?
private var titleFontColor: UIColor!
private var messageFontColor: UIColor!
private var icon: UIImage?
internal var isHit: Bool = false
internal private(set) var callback: Callback?
internal private(set) var duration: NSTimeInterval!
internal private(set) var dismiss: Bool = true

private var titleFont = UIFont.boldSystemFontOfSize(16)
private var messageFont = UIFont.systemFontOfSize(14)

private var paragraphStyle: NSMutableParagraphStyle {
let paragraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.alignment = .Left
return paragraphStyle
}

init(title: String?, message: String?, backgroundColor: UIColor, titleFontColor: UIColor, messageFontColor: UIColor,
icon: UIImage?, duration: NSTimeInterval, dismiss: Bool = true, callback: Callback?) {
self.title = title
self.message = message
self.duration = duration
self.callback = callback
self.titleFontColor = titleFontColor
self.messageFontColor = messageFontColor
self.icon = icon
self.dismiss = dismiss

super.init(frame: CGRectZero)

self.backgroundColor = backgroundColor
usesAutoLayout(true)
initSubviews()
}

private func initSubviews() {
let iconImageView = initIcon()
let titleLabel = initTitle()
let messageLabel = initMessage()

let views = ["icon": iconImageView, "title": titleLabel, "message": messageLabel]
let metrics = [
"iconTop": Message.Padding,
"titleTop": Message.Padding,
"right": Message.Padding,
"bottom": Message.Padding,
"messageLeft": Message.Padding + Message.MessageOffset,
"iconLeft": Message.Padding,

"padding": Message.MessageOffset,
"width": Message.IconSize,
"height": Message.IconSize
]

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[icon(==width)]", options: .allZeros,
metrics: metrics, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[icon(==height)]", options: .allZeros,
metrics: metrics, views: views))

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-iconLeft-[icon]-messageLeft-[title]-right-|",
options: .allZeros, metrics: metrics, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-iconLeft-[icon]-messageLeft-[message]-right-|",
options: .allZeros, metrics: metrics, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-titleTop-[title]-padding-[message]-bottom-|",
options: .allZeros, metrics: metrics, views: views))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-iconTop-[icon]",
options: .allZeros, metrics: metrics, views: views))
}

private func initIcon() -> UIImageView {
let iconImageView = UIImageView()
iconImageView.image = icon
iconImageView.usesAutoLayout(true)
addSubview(iconImageView)
return iconImageView
}

private func initTitle() -> UILabel {
let titleLabel = UILabel()
titleLabel.numberOfLines = 0
titleLabel.usesAutoLayout(true)
addSubview(titleLabel)

if let title = title {
let attributes = [
NSFontAttributeName : titleFont,
NSForegroundColorAttributeName: titleFontColor,
NSParagraphStyleAttributeName: paragraphStyle
]
titleLabel.attributedText = NSAttributedString(string: title, attributes: attributes)
}
return titleLabel
}

private func initMessage() -> UILabel {
let messageLabel = UILabel()
messageLabel.numberOfLines = 0
messageLabel.usesAutoLayout(true)
addSubview(messageLabel)

if let message = message {
let attributes = [
NSFontAttributeName : messageFont,
NSForegroundColorAttributeName: messageFontColor,
NSParagraphStyleAttributeName: paragraphStyle
]
messageLabel.attributedText = NSAttributedString(string: message, attributes: attributes)
}
return messageLabel
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override func updateConstraints() {
superview?.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: .allZeros,
metrics: nil, views: ["view": self]))
super.updateConstraints()
}

override func intrinsicContentSize() -> CGSize {
return CGSize(width: statusBarFrame.width, height: estimatedHeight)
}

var estimatedHeight: CGFloat {
if icon != nil {
return max(Message.Padding * 2 + titleSize.height + messageSize.height + statusBarOffset, Message.Padding * 2 + Message.IconSize + statusBarOffset)

} else {
return Message.Padding * 2 + titleSize.height + messageSize.height + statusBarOffset
}
}

var titleSize: CGSize {
let boundedSize = CGSize(width: availableWidth, height: CGFloat.max)
let titleFontAttributes = [NSFontAttributeName: titleFont]
if let size = title?.boundingRectWithSize(boundedSize, options: .TruncatesLastVisibleLine | .UsesLineFragmentOrigin, attributes: titleFontAttributes, context: nil).size {
return CGSize(width: ceil(size.width), height: ceil(size.height))
}
return CGSizeZero
}

var messageSize: CGSize {
let boundedSize = CGSize(width: availableWidth, height: CGFloat.max)
let titleFontAttributes = [NSFontAttributeName: messageFont]
if let size = message?.boundingRectWithSize(boundedSize, options: .TruncatesLastVisibleLine | .UsesLineFragmentOrigin, attributes: titleFontAttributes, context: nil).size {
return CGSize(width: ceil(size.width), height: ceil(size.height))
}
return CGSizeZero
}

var statusBarOffset: CGFloat {
return statusBarFrame.height
}

var width: CGFloat {
return statusBarFrame.width
}

var statusBarFrame: CGRect {
let windowFrame = UIApplication.sharedApplication().keyWindow!.frame
let statusFrame = UIApplication.sharedApplication().statusBarFrame
return CGRect(x: windowFrame.minX, y: windowFrame.minY, width: windowFrame.width, height: statusFrame.height)
}

var availableWidth: CGFloat {
return width - Message.Padding * 2 - Message.IconSize
}

// MARK: Identifiable

internal func id() -> NSUUID {
return uuid
}

}

extension UIView {

func usesAutoLayout(usesAutoLayout: Bool) {
setTranslatesAutoresizingMaskIntoConstraints(!usesAutoLayout)
}

}
Loading

0 comments on commit 75699a4

Please sign in to comment.