Quantcast
Channel: Appcelerator Developer Center Q&A Unanswered Questions 20
Viewing all articles
Browse latest Browse all 8068

Titanium Module: Passing Titanium.UI.Button into module to display UIPopoverController

$
0
0

I am developing a module which will work for both iPhone and iPad. In this module, I am trying to mimic UIActivityViewController and will display custom for both iPhone and iPad.

Problem: The Popover is displayed at top, left corner in iPad screen. The button from which I display Popup is created into Titanium SDK and I am passing the same Button as parameter into the module, which in turn, will use the same to display Popover at particular position.

Please check my code below: [The code is much bigger than the pasted code but I have simplified the code and pasted only the basics showing how my code works.]

> Titanium Code:

root = {};
        var w = Titanium.UI.createWindow({
            top : 0,
            left : 0,
            right : 0,
            bottom : 0,
            navBarHidden : true,
            orientationModes : [Ti.UI.PORTRAIT, Ti.UI.UPSIDE_PORTRAIT, Ti.UI.LANDSCAPE_LEFT, Ti.UI.LANDSCAPE_RIGHT]
        });
        w.open();
 
        var shareItButton = Titanium.UI.createButton({
             top : 10,
             right : 40,
             width: 90,
             height: 30,
             backgroundImage : 'images/shareit.png'
        });
        baseview.add(shareItButton);
 
        // Display Popover when shareItButton is clicked
        shareItButton.addEventListener('click', function(e) {
            var ShareView = require('com.xyz.sharing');
            root.shareController = ShareView.shareViewController; // The proxy controller
 
            root.shareController.shareContent({
               message: "Share Message",
               url: "http://www.google.com",
               title: "Share Title",
               file: "File path for iBooks functionality",
               shareButton: e.source // e.source is actually a button
            });
        });
> Titanium Module: com.xyz.sharing

Module.h

#import "TiModule.h"
 
    @interface ComXYZSharingModule : TiModule {
 
    }
 
    - (id) shareViewController;
    @end
Module.m
@implementation ComXYZSharingModule
    // Ignoring built-in methods, I have pasted only Custom methods
    - (id) shareViewController {
        ComXYZSharingProxy *proxy = [[ComXYZSharingProxy alloc] init];
        proxy.module = self;
        return proxy;
    }
    @end
Proxy.h
@interface ComXYZSharingProxy : TiProxy
 
    @property (nonatomic, strong) ComXYZSharingModule *module;
    @property (nonatomic, strong) NSDictionary *content;
    @property (strong, nonatomic) TiViewProxy *exportView;
 
    - (void) shareContent : (id) args;
    @end
Proxy.m
@implementation ComXYZSharingProxy
        - (void) shareContent : (id) args {
            ENSURE_UI_THREAD(shareContent, args);
            NSArray *val = args;
            NSDictionary *dict = [val objectAtIndex: 0];
 
            self.content = dict;
            if ([dict objectForKey: @"shareButton"]) {
                self.exportView = [dict objectForKey: @"shareButton"]; // This is the Button which gives me wrong values
                NSLog(@"Button Found", nil);
                NSLog([self.exportView description], nil);
 
                CustomActivityController *controller = [[CustomActivityController alloc] init];  // We have just created the controller which is just customization of UIActivityViewController and that's the main view which will be displayed in Popover for iPad and in modal control for iPhone
 
                UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:controller];
                //[self setPopoverController:popover];
                //[popover setDelegate:self];
                [popover setBackgroundColor: [UIColor greenColor]];
                popover.popoverContentSize = CGSizeMake(320, 250);
                CGRect rect = [TiUtils rectValue: [self.exportView rect]];
 
                NSLog([NSString stringWithFormat: @"Size: x: %f,y: %f, width: %f, height: %f", rect.origin.x, rect.origin.y
           , rect.size.width, rect.size.height], nil);
 
                [popover presentPopoverFromRect:rect inView:[[TiApp app] controller].view permittedArrowDirections:arrowDirections animated:animated];
            }
        }
    @end
> Output when Program runs
Button Found
Size: x: 0.00,y: 0.00, width: 0.00, height: 0.00 // [This should be actual size of Button but somehow it's not]
Due to this problem my Popover displays at top left corner of the iPad screen. Anyone would help to solve the issue? If I try to use TiUIButton or TiUIButtonProxy then also the result is same.

Viewing all articles
Browse latest Browse all 8068

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>