Giter Site home page Giter Site logo

nmessenger's Introduction

./NMessenger

License MIT

NMessenger is a fast, lightweight messenger component built on AsyncDisplaykit and written in Swift. Developers can inherently achieve 60FPS scrolling and smooth transitions with rich content components.

NMessenger

Features

Built-in support for:

Version Information

  • 1.0.0

Requirements

  • iOS 8.2+

Installation for Cocoapods

# For latest release in cocoapods - 1.0.80 (Swift 3, ASDK 2.X)
pod 'NMessenger'

# For ASDK 1.9
pod 'NMessenger', '1.0.79'

# For Swift 2.3 support
pod 'NMessenger', '1.0.76'

Notes

For iOS 10 Support

Add NSPhotoLibraryUsageDescription and NSCameraUsageDescription to your App Info.plist to specify the reason for accessing photo library and camera. See Cocoa Keys for more details.

Landscape Mode

  • Landscape mode is not currently supported. While it may be supported in a future release, we have disabled device rotation for NMessengerViewController to prevent issues.

Getting Started

NMessengerViewController

NMessenger comes with a prebuilt NMessengerViewController that has a few supported features.

  • Posting messages
  • Input bar with a custom placeholder
  • Camera and photo library access
  • Typing indicator support

Posting Messages

Send a text message.

func sendText(text: String, isIncomingMessage:Bool) -> GeneralMessengerCell

Text Message

---

Send a message with an image.

func sendImage(image: UIImage, isIncomingMessage:Bool) -> GeneralMessengerCell

Send a message with a network image. (Uses AsyncDisplayKit with PINCache to lazyload and cache network images)

func sendNetworkImage(imageURL: String, isIncomingMessage:Bool) -> GeneralMessengerCell

Image Message

---

A message with a collection view can be created directly from an array of views or nodes. Note: Nodes take advantage of ASDK's async rendering capabilities and will make this component scroll more smoothly.

func sendCollectionViewWithViews(views: [UIView], numberOfRows:CGFloat, isIncomingMessage:Bool) -> GeneralMessengerCell
func sendCollectionViewWithNodes(nodes: [ASDisplayNode], numberOfRows:CGFloat, isIncomingMessage:Bool) -> GeneralMessengerCell

One line CollectionView

One line CollectionView

Multi line CollectionView

Multi line CollectionView

---

Send a message with a custom view or node. Note: Nodes take advantage of ASDK's async rendering capabilities and will make this component scroll more smoothly.

func sendCustomView(view: UIView, isIncomingMessage:Bool) -> GeneralMessengerCell
func sendCustomNode(node: ASDisplayNode, isIncomingMessage:Bool) -> GeneralMessengerCell

Custom Message

These functions are meant to be overridden for network calls and other controller logic.

Typing Indicators

Typing indicators signify that incoming messages are being typed. This will be the last message in the messenger by default.

/** Adds an incoming typing indicator to the messenger */
func showTypingIndicator(avatar: ASDisplayNode) -> GeneralMessengerCell

/** Removes a typing indicator from the messenger */
func removeTypingIndicator(indicator: GeneralMessengerCell)

Typing Indicator

Custom InputBar

To use a custom input bar, you must subclass InputBarView. InputBarView conforms to InputBarViewProtocol:

@objc public protocol InputBarViewProtocol
{
    /* Superview of textInputView - can hold send button and/or attachment button*/
    var textInputAreaView: UIView! {get set}
    /* UITextView where the user will input the text*/
    var textInputView: UITextView! {get set}
    //NMessengerViewController where to input is sent to
    var controller:NMessengerViewController! {get set}
}

Both textInputAreaView and textInputView must be created in order for NMessengerViewController to have the correct behavior. controller is set by the initializer in InputBarView base class.

In order to use your custom InputBar, override func getInputBar()->InputBarView in NMessengerViewController.

NMessenger

NMessenger can be added to any view.

self.messengerView = NMessenger(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
messengerView.delegate = self
self.view.addSubview(self.messengerView)

With NMessenger, there is no need to manage a data source. Simply add a message and forget about it.

Changing and updating a message relies on a reference. These references can be passed through a delegate method or stored locally in a class.

self.delegate.deleteMessageBtnClick(self)
.
.
.
func deleteMessageBtnClick(message: GeneralMessageCell) {
  self.messengerView.removeMessage(message, .None)
}

Message Bubbles

NMessenger comes with a few prebuilt bubble types. bubble can also easily be subclassed to create a new bubble component.

SimpleBubble

Simple Bubble

DefaultBubble

Default Bubble

StackedBubble

Stacked Bubble

ImageBubble - Can be used with any 9 Patch Image

Image Bubble

By setting hasLayerMask = true, bubbles will mask their content. This is relevant for images and other rich content components.

Bubble Configuration

In order to configure custom bubbles for the messenger, you must create a new class that implements BubbleConfigurationProtocol.

/** Configures a bubble for a ContentNode. Implement this to create your own bubble configuration */
protocol BubbleConfigurationProtocol {
    var isMasked: Bool {get set}
    
    /** Create and return a UI color representing an incoming message */
    func getIncomingColor() -> UIColor
    
    /** Create and return a UI color representing an outgoing message */
    func getOutgoingColor() -> UIColor
    
    /** Create and return a bubble for the ContentNode */
    func getBubble() -> Bubble
    
    /** Create and return a bubble that is used by the Message group for Message nodes after the first. This is typically used to "stack" messages */
    func getSecondaryBubble() -> Bubble
}

This protocol is meant to provide a new instance of the bubble class for primary (messageNode) and secondary (messageGroup) bubble types. By changing var sharedBubbleConfiguration: BubbleConfigurationProtocol in NMessengerViewController, you can set the configuration for all newly added messages.

Content Nodes and Custom Components

Content Nodes

A Content Node holds message content in a MessageNode (everything inside of the bubble).

Content Node

Subclassing ContentNode gives you the ability to define your own content. This is particularly useful for creating rich content components that are not in our stock message kit. Alternatively, you can initialize a 'CustomContentNode' with your own view or node.

Content Nodes can also be given a BubbleConfigurationProtocol to customize their bubble.

GeneralMessengerCell

GeneralMessengerCell can be subclassed to make any type of component. All messenger cells extend this object.

Timestamps

Timestamps can be easily added with the MessageSentIndicator class.

let messageTimestamp = MessageSentIndicator()
messageTimestamp.messageSentText = "NOW"

//NMessengerViewController
self.addMessageToMessenger(messageTimestamp)

//NMessenger
messengerView.addMessage(messageTimestamp, scrollsToMessage: false)

Avatars

Custom avatars can be set with an AsyncDisplayKit ASImageNode.

let nAvatar = ASImageNode()
nAvatar.image = UIImage(named: "nAvatar")
.
.
.
messageNode.avatarNode = nAvatar

Head Prefetching

Many messengers prefetch at the head. This is not trivial with a UITableView or AysncDisplayKit features. NMessenger supports head prefetching out of the box.

To use the head prefetch feature, set var doesBatchFetch: Bool = true on NMessenger. NMessengerDelegate will also need to be implemented and set by your controller.

@objc protocol NMessengerDelegate {
    /**
     Triggered when a load batch content should be called. This method is called on a background thread.
     Make sure to add prefetched content with *endBatchFetchWithMessages(messages: [GeneralMessengerCell])**/
    optional func batchFetchContent()
    /** Returns a newly created loading Indicator that should be used at the top of the messenger */
    optional func batchFetchLoadingIndicator()->GeneralMessengerCell
}

All batch fetch network calls should be done in batchFetchContent. Make sure to add your message cells with endBatchFetchWithMessages(messages: [GeneralMessengerCell]) to end the batch fetch. Calling this function will remove the loading indicator and batch fetch lock.

Message Groups

Message Groups can be used to stack messages and animate avatars. Like MessageNode, MessageGroup extends GeneralMessageCell. The difference, however is that MessageGroup holds a table of MessageNodes rather than a ContentNode.

================
| MessageGroup | -> ===============    ===============
================    | MessageNode | -> | ContentNode | (Primary Bubble)
                    ---------------    ===============
                    | MessageNode | -> | ContentNode | (Secondary Bubble)
                    ---------------    ===============
                    | MessageNode | -> | ContentNode | (Secondary Bubble)
                    ---------------    ===============
                    | MessageNode | -> | ContentNode | (Secondary Bubble)
                    ===============    ===============

Additionally, MessageGroup determines the bubble type of the MessageNode's content based on the position in the table. The first message's content will have a primary bubble, the rest will have a secondary bubble. Typically, the avatar will be disabled on any MessagesNode in the group, but kept for the MessageGroup.

Message Group

Adding, Removing, and Updating

Message Groups include a few slick animations for Adding, Removing, and Updating MessageNodes in the group. These can be called directly from MessageGroup or Added and Removed from NMessenger. Note: These are not surfaced in the NMessengerViewController yet

It is recommended that they are removed from NMessenger because of the possibility that the MessageNode removed was the last message in the group. If this happens, the MessageGroup will remain after the MessageGroup was removed. NMessenger makes sure that in this case the MessageGroup is removed from the messenger.

Adding

To add a MessageNode.

messageGroup.addMessageToGroup(message: GeneralMessengerCell, completion: (()->Void)?)

Message Group Add Animation

Removing

To remove a MessageNode.

messageGroup.removeMessageFromGroup(message: GeneralMessengerCell, completion: (()->Void)?)

Message Group Remove Animation

Updating

To update an existing MessageNode with a new MessageNode.

messageGroup.replaceMessage(message: GeneralMessengerCell, withMessage newMessage: GeneralMessengerCell, completion: (()->Void)?)

Message Group Update Animation

Authors

  • Aaron Tainter
  • David Schechter

nmessenger's People

Contributors

a-ono avatar atainter avatar basthomas avatar davidebest avatar davidschechter avatar eirikeikaas avatar jonybur avatar josephchern avatar lazerwalker avatar mbalex99 avatar nixzhu avatar sreenivasr avatar suprie avatar vhuang01 avatar wesleybuck 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 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  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

nmessenger's Issues

required a higher minimum deployment target error with CocoaPods

Hi,

I'm trying to install this library via CocoaPods. I created an Xcode project (Xcode 7.3) and set its Deployment Target to 8.2.

Then I initialized the project by running pod init. Below is my Podfile.

platform :ios, '8.2'

target 'Messenger' do
  use_frameworks!

  pod 'NMessenger', '~> 1.0'

end

But when I run pod install, I get the following error.

[!] Unable to satisfy the following requirements:

  • NMessenger (~> 1.0) required by Podfile

Specs satisfying the NMessenger (~> 1.0) dependency were found, but they required a higher minimum deployment target.

Anything I'm missing?

dismiss keyboard bug when scrolling down on tableNode - swift 3

When scrolling down on the tableView with the keyboard up the InputBarView does not stay in sync with the keyboard as it is being dismissed. I tried adding a few things around the scrollViewDidScroll if state.down == true and also in the KeyboardNotification to no avail. GIF below to show what I am talking about.

Also, just a heads up. The NMessengerViewController is rotating based on orientation. Just wanted to make you aware in case that was an unintended effect from updating the master.

keyboarddismissgif

Issue with Input bar.

Provided is a screen shot of what I am seeing.
-Device Description

iphone6+
running iOS9.3

I do have Gboard installed I don't know if that is the root of the issue or not.

-Issue Description
The input bar is floating way above the top of the keyboard.
ScreenShot

When swapping keyboards the input field is now gone. I would assume it is under the keyboard.
if I quit the app and and relaunch with regular keyboard it seems to be fine. Then switching to Gboard the input feild launches up and disappears once you swap back again. Also all messages are gone after this point.

Can't use with Carthage

Hello,

when trying to use this package with Carthage, carthage update fails with the following error message:

*** Skipped building NMessenger due to the error:
Dependency "NMessenger" has no shared framework schemes

If you believe this to be an error, please file an issue with the maintainers at https://github.com/eBay/NMessenger/issues/new

The entry in the Cartfile is
github "eBay/nMessenger"

Thanks!

Bounciness

Hey there,

I was wondering if you guys are considering adding some UIDynamic animations. The native iOS messages app has this subtle but nice bouncing animation depending on how fast you scroll up/down.

Check out this link here, there's a gif if you scroll down to demonstrate what I mean:

https://www.objc.io/issues/5-ios7/collection-views-and-uidynamics/

Is this something you guys think you could implement?

Custom MessageNode from IB

Hey guys,

Congratulations about this awesome work! I'm grateful that you've made it.

Is it possible to create custom Message Nodes from IB designed UIViews? Kind of loading an UIView inside of a node. (I read about it in your README, but it was not that clear, and if it is possible, I will lose all advantages of AsyncDisplayKit? Or it just will be slower than a Node but way better than a regular UITableVIew/UICollectionView based chat?)

I have such complex message designs to implement, and it would take more time to create it using AsyncDisplayKit components, so I'm wondering if it is possible.

Thank you in advance!

Swift 2.3

Hi,

I get this error when building my app which has the Messenger pod installed but not included in a view controller:

NMessenger will not be code signed because its settings don't specify a development team.
“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

How can I fix this?

Black line in place of status bar

Hello! I pushed ChatMessageViewController (This class of heir NMessengerViewController) I got the black line in place of status bar. When I presented modally ChatMessageViewController I also saw the black line. How can I change it? Thanks

bug1
bug2

I push ChatMessageViewController

 func didSelectIterlocutor(_ iterlocutor: User) {
        print(iterlocutor.id, iterlocutor.displayName)
        let chatMessengerVC = ChatMessageViewController()
        navigationController?.pushViewController(chatMessengerVC, animated: true)
//        present(chatMessengerVC, animated: true, completion: nil)
    }

ChatMessageViewController 

import UIKit
import Messenger
import AsyncDisplayKit

class ChatMessageViewController: NMessengerViewController {

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        // ui 
        showTabBar(bool: false)
        // settings
        setupSettings()

    }

    // MARK: - Settings 

    fileprivate func setupSettings() {
        automaticallyAdjustsScrollViewInsets = false
    }

}

memoryCache error

I run your demo after installing podfile. but it brings up an error as in the screenshot below.
Any ideas what the reason could be?
It's in ASPINRemoteImageDownloader.m
screen shot 2016-11-05 at 10 49 31 pm

Invert bubble collection

Hey,

Is there a way to configure NMessenger in order to invert the bubble collection? Right now, when you don't have any messages already on the screen, it will add a new bubble at the top of the screen.

Is there a way to make it start from the bottom, above the keyboard? That's the native iMessage/WhatsApp functionality. Would be great if we had the option to choose which way we want it to work.

Here's a visual representation of what I mean, check out the screenshot of this lib. The WhatsApp bubbles compared to WeChat have different starting points:

https://github.com/little2s/NoChat

Thanks

Message length limit

I noticed there is a limit how many characters I can type in the textView
Is there a way to break this limit ?

update AsyncDiplayKit version?

I'm using swift 3 and need to use the latest version of AsyncDisplayKit to compile without errors. I get this error when I try to install NMessenger:

[!] Unable to satisfy the following requirements:

  • AsyncDisplayKit required by Podfile
  • AsyncDisplayKit (= 1.9.90) required by Podfile.lock
  • AsyncDisplayKit (= 1.9.80) required by NMessenger (1.0.2)

Is there anything I can do to solve this issue or is it something you will need to update in a future version?

thanks

Slow creation of Messages and MessageGroups

In my pull request I have this code to bootstrap the ExampleViewController with messages. Unfortunately, I can't figure out why it's slow.

If I only have 50 bootstrapped messages, it's still noticeable with a 1 second delay. Is there any suggestion of improving this performance?

        var messageGroups = [MessageGroup]()
        for _ in 0..<self.bootstrapWithRandomMessages {
            let isIncomingMessage = self.randomBool()
            
            let textContent = TextContentNode(textMessageString: LoremIpsum.sentences(withNumber: 2), currentViewController: self, bubbleConfiguration: self.sharedBubbleConfiguration)
            let newMessage = MessageNode(content: textContent)
            newMessage.cellPadding = self.messagePadding
            newMessage.currentViewController = self
            
            if messageGroups.last == nil || messageGroups.last?.isIncomingMessage == !isIncomingMessage {
                let newMessageGroup = self.createMessageGroup()
                //add avatar if incoming message
                if isIncomingMessage {
                    newMessageGroup.avatarNode = self.createAvatar()
                }
                newMessageGroup.isIncomingMessage = isIncomingMessage
                newMessageGroup.addMessageToGroup(newMessage, completion: nil)
                messageGroups.append(newMessageGroup)
            } else {
                messageGroups.last?.addMessageToGroup(newMessage, completion: nil)
            }
            
        }
        
        self.messengerView.addMessages(messageGroups, scrollsToMessage: false)
        self.messengerView.scrollToLastMessage(animated: false)
        self.lastMessageGroup = messageGroups.last

Tapping on gallery button hides the status bar

Hi,

I encountered this issue after the latest update with the improvements to the camera view. When I tap on the gallery button in the camera view and select a photo from my photo library and come back, the status bar is gone.

Let me show you.

  1. Before doing anything. Status bar is there.
    rsz_img_1697
  2. Taps on the gallery button to bring up the image picker. Status bar is gone.
    rsz_1img_1698
  3. Selects a photo. Returns to the chat view. Status bar is still gone.
    rsz_img_1699

I did some Googling on this issue and found this question which describes this very problem. There are some answers which worked for some and not for others. But that might give you an idea on how to fix this.

Thanks for the quick fixes and replies as always!

cannot set avatar if the image is loaded from file

Cannot set avatar if the image is loaded from file.

I download profile image and save it to the device, and then loaded it into NSData, create UIImage, set it as avatar

But got an error "cannot get relative dimension"

Only works with resource images now :(

AddMessage with no animation

According to the code, I can't find a way to add and present a new message without animation.

On class NMessengerViewController I would like to override addMessageToMessenger method, but it is specified to don't override.
I evenly tried in this way:

override func addMessageToMessenger(_ message: GeneralMessengerCell) {
    message.currentViewController = self
    super.messengerView.addMessage(message, scrollsToMessage: true, withAnimation: .none)
}

In this way rows are presented with no animation, but some times cells have a broken UI

What if sending a message failed?

Hey,

I was wondering what happens if a message fails to send? For example iMessage and WhatsApp show an exclamation mark next to the message where the user can manually retry to send it.

Is there something similar for NMessager that's already been implemented? I'd use it if the message failed to send for whatever reason (no internet/backend down/internal server error/whatever).

Thanks

Open keyboard animation

When opening the keyboard, the height of the tableview containing the messages seems to change without animating. This causes the behaviour seen in the gif below (here with slow animations enabled).

ezgif com-optimize

NMessengerViewController Memory Leak.

When subclassing NMessengerViewController, without any other code than the deinit function. When the View controller is pushed from root view controller in a navigation, on pop back deinit is never called. I've made the test by replacing the extend of NMessengerViewController by UIViewController, the deinit was called.

So I've check the code and found some problems with delegate attributes

open class NMessenger: UIView {
    // ...
    open weak var delegate: NMessengerDelegate?
    // ...
}

open class CameraViewController {
    open weak var cameraDelegate: CameraViewDelegate!
}
public protocol CameraViewDelegate: class{

open class InputBarView: UIView, InputBarViewProtocol {
    open weak controller:NMessengerViewController!
}

I've found these missing weak, but I'm still missing some of them or it is another stuff, because deinit is still not called. Usually in the cocoa framework we have to set delegate as weak, and not to keep a strong reference to them if they need to be deinit https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

Edit
I think I've found one more in

open class GeneralMessengerCell: ASCellNode {
    // ...
    open weak var currentViewController: UIViewController?
    // ...
}

But it still not deinit.

input bar offset.

Provided is a screen shot of what I am seeing.
-Device Description

iphone6+
running iOS9.3

-Issue Description

My previous issue was closed but it seems to not be resolved. I have pulled the latest master and ran a pod update but when i run the example and switch keyboards the input field is way above the keyboard.
I do have Gboard installed but the issue is replicated also by switching back and forth from the emoji keyboard.

ScreenShot

When swapping keyboards the input field is now gone. I would assume it is under the keyboard.
if I quit the app and and relaunch with regular keyboard it seems to be fine. Then switching to Gboard the input feild launches up and disappears once you swap back again. Also all messages are gone after this point.

Support custom input views

Hi David,

to support own custom input views please move the setUpConstriantsForViews() method from viewDidLoad() to viewWillAppear(animated: Bool).

After that change we are able to create our own input views in our NMessengerViewController by doing the following:

    override func viewDidLoad() {
        super.viewDidLoad()

        self.inputBarView.removeFromSuperview()
        self.inputBarView = NuukInputBarView(controller: self)
        self.view.addSubview(self.inputBarView)
    }

Best Alex

Text limitations

Hello! When I wrote three lines of text, the longer I could not get, how to get around this limitation?

Taping on message action

Is there a way to get response when I tap on message? For example I received an image and would like to tap on it and have it in fullscreen.
All I need is to determine what message I tapped and if it's a picture message I want to have access to that UIImage.
Is something like this even possible with this library? Since it is not using any indexPath technique so I have no clue what to do
Please give some reasonable help
Thank you!

Use Legacy Swift Language Version

With Xcode 8.0 and Swift 3.0 using Use Legacy Swift Language Version=YES causes compiler to fail, even if this is needed since it Xcode tried to convert to modern Swift syntax.

Location of photo media messages.

This is on

iPhone 6s+
iOS 9.3.4

Things have improved on the content resizing in the bubble when rotating the device. Specifically for the photo media message when you rotate to landscape mode the message bubble is in the center of the screen instead of off to the right. See photo attached. It could be by design it just seemed strange to me. So sorry if this is not a bug.

img_0013

it seems also to zoom in on the image when in landscape mode.

Custom nodes similar to timestamp view in README

I was curious if the current example could be updated to include a custom content node similar to the screenshot with timestamp views on the README page. If not, could someone explain how to either add a node that is the full width of the NMessengerView with no background?

nmessenger-overview

interactive pop gesture

Hi, is there a way to make the input bar back to it's original location? In my viewWillDisappear method I have inputBarView.textInputView.resignFirstResponder(); inputBarView.frame = CGRect(x: 0, y: 391, w: 320, h: 43) but the second line doesn't seem to work. the textview moves down slowly as I swipe toward right leaving a blank space below textview. Is it possible to make it move back to it's original location as soon as interactive pop gesture starts?

No buttons in the camera view

Hi,

In the camera view that opens up when you tap the button in the default input view, there are no buttons to take a photo or dismiss the view. Are we supposed to add them ourselves? If so, how?

rsz_img_1676

Typing indicator

Can someone post a better explanation for typing indicator?
if I call function showTypingIndicator what I need to pass for ASDisplayNode ?

Problem when pod install

The Podfile contains framework targets, for which the Podfile does not contain host targets (targets which embed the framework).
If this project is for doing framework development, you can ignore this message. Otherwise, add a target to the Podfile that embeds these frameworks to make this message go away (e.g. a test target).

I downloaded the project, run pod install, got this message. Should I ignore it ? or do what it says? Any suggestions ?

a better instruction how to start?

I installed the pod to the fresh project
What are my next steps?
I could not use a new Nmessage VC or import anything
import NMessenger gives me an error. ..
What I am doing wrong?

PinCache

Hi,

This won't even build now as missing PinCache prevents it.

resizing avatar image?

Hi, is there anyway to resize a 48px_48px avatar icon to 20_20? will ASImageNode cache network avatar images?

StackedBubbles don't draw properly when bubble has multiple lines (plus quick fix)

When you translated to swift 3 you wrote M_PI_2 instead of M_PI when defining a path causing the StackedBubbles to be drawn in a weird manner.

Just go to StackedBubbles.swift and in the sizeToBounds func change the last addArc func call:

    path.addArc(center: CGPoint(x: rect.minX, y: rect.minY), radius: radius2, startAngle: CGFloat(M_PI_2), endAngle: CGFloat(-M_PI_2), clockwise: false)

to

    path.addArc(center: CGPoint(x: rect.minX, y: rect.minY), radius: radius2, startAngle: CGFloat(M_PI), endAngle: CGFloat(-M_PI_2), clockwise: false)

Custom InputBarView

Please provide ability for custom InputBarView. I thought e.g. to provide protocol that has to be implemented, that developers could define custom xibs that will be used instead of default.

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.