No description, website, or topics provided.
Objective-C Ruby
Latest commit cdede4e Dec 22, 2012 @marciomeschini marciomeschini Merge branch 'refs/heads/dev'
Failed to load latest commit information.


FWTPopoverView screenshot

FWTPopoverView is a pretty flexible custom view for when you need a classic popover with a pointing arrow. The idea behind it was to create a very simple and basic API and make it easy to extend by accessing its custom objects/blocks entrypoints. FWTPopoverView is pure CG code, so no need to add assets and resolution independent for free.


  • XCode 4.4.1 or higher
  • iOS 5.0


FWTPopoverView has few properties but uses several custom objects. If you want to adjust/change the appearance of the background, you change properties inside the background custom object; that also goes for animations and so on. On the other hand, if you're happy with the default style, all you need to do is set your contentSize and add your content to the contentView property.

There are two optional blocks that can be executed when the popover is presented/dismissed.

This project is not yet ARC-ready.

Comparison with UIPopoverController

  • Block based API
  • Appearance/dismiss animations are easy to customise through animation blocks
  • Clean API to present/dismiss more than one popover either sequentially or all at once
  • No minimum size restrictions for the popover content
  • Works on the iPhone as well as on the iPad

How to use it: initializing

Generally you don't initialize FWTPopoverView with a frame instead you set the contentSize and then call:

  • presentFromRect: inView: permittedArrowDirection: animated:

The default behaviour of the FWTPopoverView is to adjust its frame position to fit inside the superview bounds, when it falls on an intersection with the superview. You can change this by setting adjustPositionInSuperviewEnabled to NO.

How to use it: configuration


This class needs a quick introduction: the popover image is a runtime image generated by a CAShapeLayer subclass. The layer is not directly added to the view hierarchy, instead is rendered in a separate context and the resulting image is used. The image is stretchable and takes up only a small chunk of memory. As with every CAShapeLayer you have access to all shape & style properties (clearly they're not animatable this time). The cornerRadius property is used as a property for the path.

  • drawPathBlock this block is executed just before return the image. It's a good point to customize or add more drawing stuff to your context
  • (UIBezierPath *)bezierPathForRect: returns the path for the current state/frame


This class is a simple animation properties container.


This class encapsulates some arrow specific properties.

  • direction (readonly) the direction in which the popover arrow is pointing
  • size the size of the arrow
  • offset (readonly) the distance (measured in points) from the center of the view to the center line of the arrow
  • cornerOffset the distance (measured in points) from the center of the arrow to the pointing edge of the arrow

View hierarchy

For a better understanding see the subviews/sublayers involved. Available public properties are in brackets.

  • popoverView {contentSize, adjustPositionInSuperviewEnabled}
    • backgroundImageView
    • contentView

For your interest

Future release of the backgroundHelper will include support for png images, as in UIPopoverBackgroundView.


The sample project shows how to use and how to create a custom FWTPopoverView. If you don't have time to read it this is what you need:

    //  present
    FWTPopoverView *popoverView = [[[FWTPopoverView alloc] init] autorelease];
    popoverView.contentSize = CGSizeMake(240, 140);
    [popoverView presentFromRect:rect


    //  dismiss
    [popoverView dismissPopoverAnimated:YES];


Apache License Version 2.0


Saudi Telecom Mobile Apps team, who enabled and collaborated with us to extract source code from My STC App for this library.

Support, bugs and feature requests

If you want to submit a feature request, please do so via the issue tracker on github. If you want to submit a bug report, please also do so via the issue tracker, including a diagnosis of the problem and a suggested fix (in code).