ActionsheetPicker是空白的

时间:2014-10-31 08:09:27

标签: ios uiactionsheet

我让ActionSheetPicker在测试项目中工作,但是当我尝试将相同的代码粘贴到现有项目中时,我看到了:

Blank ActionSheetPicker

我从他们的示例页面逐字sample code

NSArray *colors = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", @"Orange", nil];

[ActionSheetStringPicker showPickerWithTitle:@"Select a Color"
                                        rows:colors
                            initialSelection:0
                                   doneBlock:nil
                                 cancelBlock:nil
                                      origin:sender];

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

实际上iOS 8存在问题。之后的代码将在iOS 7中运行 UIActionSheet不是设计为子类,也不应该为其层次结构添加视图。如果您需要提供比UIActionSheet API提供的更多自定义的工作表,您可以创建自己的工作表并使用presentViewController以模态方式呈现它:animated:completion:

答案 1 :(得分:2)

UIActionSheet并非设计为子类。创建自己的操作表。

文件:CustomActionSheet.h

//
//  CustomActionSheet.h
//  CustomActionSheet
//
//  Created by Ramesh Annadurai on 09/07/14.
//  Copyright (c) 2014 Slingshots. All rights reserved.
//

#define SYSTEM_VERSION_LESS_THAN(version) ([[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch] == NSOrderedAscending)

#import <UIKit/UIKit.h>
#import "CustomActionSheetDelegate.h"

@interface CustomActionSheet : UIView

@property (strong, nonatomic) id<CustomActionSheetDelegate> delegate;

- (id) init;
- (void) addContentView:(UIView *) contentView;
- (void) showInView:(UIView *) theView;
- (void) rotateToCurrentOrientation;

@end

文件:CustomActionSheet.m

//
//  CustomActionSheet.m
//  CustomActionSheet
//
//  Created by Ramesh Annadurai on 09/07/14.
//  Copyright (c) 2014 Slingshots. All rights reserved.
//

#import "CustomActionSheet.h"

@interface CustomActionSheet ()

@property (readonly) UIView *transparentView;
@property (readonly) UIToolbar *toolBar;
@property (readonly) UIBarButtonItem *flexBarButtonItem, *doneBarButtonItem;

@property (strong, nonatomic) UIView *mContentView;

@property BOOL shouldCancelOnTouch, visible;

@end

@implementation CustomActionSheet

@synthesize transparentView = _transparentView, toolBar = _toolBar, flexBarButtonItem = _flexBarButtonItem, doneBarButtonItem = _doneBarButtonItem;

- (id) init
{

    self = [super initWithFrame:CGRectMake(0, 0, CGRectGetWidth([[UIScreen mainScreen] bounds]), 0)];

    if (self) {

        self.shouldCancelOnTouch = YES;

        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissActionSheet)];
        [singleTap setNumberOfTapsRequired:1];
        [self.transparentView addGestureRecognizer:singleTap];

        [self setBackgroundColor:[UIColor whiteColor]];

    }

    return self;

}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

- (void) addContentView:(UIView *)contentView
{

    [self.toolBar setItems:@[self.flexBarButtonItem, self.doneBarButtonItem]];
    [self addSubview:self.toolBar];

    if (contentView) {

        float width;

        UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        CGRect screenRect = [[UIScreen mainScreen] bounds];

        if (UIInterfaceOrientationIsPortrait(statusBarOrientation)) {
            width = CGRectGetWidth(screenRect);
        } else {
            width = CGRectGetHeight(screenRect);
        }

        self.mContentView = contentView;

        [self.mContentView setFrame:CGRectMake(0, CGRectGetHeight(self.toolBar.frame), width, CGRectGetHeight(self.mContentView.frame))];

        NSLog(@"tool bar height : %f", CGRectGetHeight(self.toolBar.frame));

        [self.mContentView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

        [self addSubview:self.mContentView];

        self.shouldCancelOnTouch = NO;

    }

}

- (void) showInView:(UIView *)theView
{

    /*
     * 1. Add the view (self) as sub view of the parent (theView) view.
     * 2. Insert the transparent view to disable the parent view from the user intraction.
     */

    [theView addSubview:self];
    [theView insertSubview:self.transparentView belowSubview:self];

    UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    float width, height, x;

    width = height = x = 0;

    if (UIInterfaceOrientationIsPortrait(statusBarOrientation)) {
        width = CGRectGetWidth(screenRect);
        height = CGRectGetHeight(screenRect);
    } else {
        width = CGRectGetHeight(screenRect);
        height = CGRectGetWidth(screenRect);
    }

    [self.transparentView setFrame:CGRectMake(0, 0, width, height)];

    [self.transparentView setCenter:CGPointMake(width / 2.0, height / 2.0)];

    [self setCenter:CGPointMake(width / 2.0, height - CGRectGetHeight(self.frame) / 2.0)];

    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {

        [UIView animateWithDuration:0.2f
                              delay:0.0f
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^() {

                             [self.transparentView setAlpha:0.4f];

                             [self setCenter:CGPointMake(width / 2.0, (height - 20) - CGRectGetHeight(self.frame) / 2.0)];

                             [self setFrame:CGRectMake(0, 0, width, CGRectGetHeight(self.mContentView.frame) + CGRectGetHeight(self.toolBar.frame))]; // height -> content view height + toolbar height

                         } completion:^(BOOL finished) {
                             self.visible = YES;
                         }];
    } else {

        [UIView animateWithDuration:0.5f
                              delay:0
             usingSpringWithDamping:0.6f
              initialSpringVelocity:0
                            options:UIViewAnimationOptionCurveLinear
                         animations:^{

                             [self.transparentView setAlpha:0.4f];

                             [self setCenter:CGPointMake(width / 2.0, height - CGRectGetHeight(self.frame) / 2.0)];

                             [self setFrame:CGRectMake(0, 0, width, CGRectGetHeight(self.mContentView.frame) + CGRectGetHeight(self.toolBar.frame))]; // height -> content view height + toolbar height

                         } completion:^(BOOL finished) {
                             self.visible = YES;
                         }];
    }


}

- (void) removeFromView {

    if (self.shouldCancelOnTouch) {

        if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {


            [UIView animateWithDuration:0.2f
                                  delay:0.0f
                                options:UIViewAnimationOptionCurveEaseOut
                             animations:^() {

                                 [self.transparentView setAlpha:0.0f];
                                 self.center = CGPointMake(CGRectGetWidth(self.frame) / 2.0, CGRectGetHeight([UIScreen mainScreen].bounds) + CGRectGetHeight(self.frame) / 2.0);

                             } completion:^(BOOL finished) {
                                 [self.transparentView removeFromSuperview];
                                 [self removeFromSuperview];
                                 self.visible = NO;
                             }];

        } else {

            [UIView animateWithDuration:0.5f
                                  delay:0
                 usingSpringWithDamping:0.6f
                  initialSpringVelocity:0
                                options:UIViewAnimationOptionCurveLinear
                             animations:^{

                                 [self.transparentView setAlpha:0.0f];
                                 self.center = CGPointMake(CGRectGetWidth(self.frame) / 2.0, CGRectGetHeight([UIScreen mainScreen].bounds) + CGRectGetHeight(self.frame) / 2.0);

                             } completion:^(BOOL finished) {
                                 [self.transparentView removeFromSuperview];
                                 [self removeFromSuperview];
                                 self.visible = NO;
                             }];

        }

    }

}

-(void) dismissActionSheet
{
    [self removeFromView];
}

#pragma mark - UI Elements

- (UIView *) transparentView
{
    if (!_transparentView) {
        _transparentView = [UIView new];
        [_transparentView setBackgroundColor:[UIColor blackColor]];
        [_transparentView setAlpha:0.0f];
    }
    return _transparentView;
}

- (UIToolbar *)toolBar
{
    if (!_toolBar) {
        _toolBar = [UIToolbar new];
        [_toolBar setBarStyle:UIBarStyleBlack];
        [_toolBar setTranslucent:YES];
        [_toolBar setTintColor:nil];
        [_toolBar setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
        [_toolBar sizeToFit];
    }
    return _toolBar;
}

- (UIBarButtonItem *) flexBarButtonItem
{
    if (!_flexBarButtonItem) {
        _flexBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    }
    return _flexBarButtonItem;
}

- (UIBarButtonItem *) doneBarButtonItem
{
    if (!_doneBarButtonItem) {
        _doneBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonAction:)];
    }
    return _doneBarButtonItem;
}

#pragma mark - Auto Layout Constraints

#pragma mark - Button Action Methods

- (void) doneButtonAction:(id) sender
{
    self.shouldCancelOnTouch = YES;

    [self dismissActionSheet];

    if ([self.delegate respondsToSelector:@selector(CustomActionSheetDoneWithUserInfo:)]) {

        NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
        [userInfo setValue:self forKey:@"actionSheet"];

        [self.delegate performSelector:@selector(CustomActionSheetDoneWithUserInfo:) withObject:userInfo];

    }
}

#pragma mark - Gesture Recognizer

#pragma mark - Other Methods

-(void) rotateToCurrentOrientation
{

    UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    float width, height, x;

    width = height = x = 0;

    if (UIInterfaceOrientationIsPortrait(statusBarOrientation)) {
        width = CGRectGetWidth(screenRect);
        height = CGRectGetHeight(screenRect);
    } else {
        width = CGRectGetHeight(screenRect);
        height = CGRectGetWidth(screenRect);
    }

    [self.transparentView setFrame:CGRectMake(0, 0, width, height)];

    [self.transparentView setCenter:CGPointMake(width / 2.0, height / 2.0)];

    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        [self setFrame:CGRectMake(0, 0, width, CGRectGetHeight(self.mContentView.frame) + CGRectGetHeight(self.toolBar.frame))]; // height -> content view height + toolbar height
        [self setCenter:CGPointMake(width / 2.0, (height - 20) - CGRectGetHeight(self.frame) / 2.0)];
    } else {
        [self setFrame:CGRectMake(0, 0, width, CGRectGetHeight(self.mContentView.frame) + CGRectGetHeight(self.toolBar.frame))]; // height -> content view height + toolbar height
        [self setCenter:CGPointMake(width / 2.0, height - CGRectGetHeight(self.frame) / 2.0)];
    }

    //[self.mContentView setFrame:CGRectMake(0, CGRectGetHeight(self.toolBar.frame), width, CGRectGetHeight(self.mContentView.frame))];

    [self.toolBar setFrame:CGRectMake(0, 0, width, 44)];

}

#pragma mark - Drawing Methods

/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
 {
 // Drawing code
 }
 */

@end

文件:CustomActionSheetDelegate.h

//
//  CustomActionSheetDelegate.h
//  CustomActionSheetDelegate
//
//  Created by Ramesh Annadurai on 10/07/14.
//  Copyright (c) 2014 Slingshots. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol CustomActionSheetDelegate <NSObject>

@optional
- (void) CustomActionSheetDoneWithUserInfo:(NSDictionary *) userInfo;

@end

最后在视图控制器中使用此自定义操作表(即在按钮操作中)。将您的选择器视图添加为innerView

的子视图
UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
CGRect screenRect = [[UIScreen mainScreen] bounds];

float width = 0;

if (UIInterfaceOrientationIsPortrait(statusBarOrientation)) {
    width = CGRectGetWidth(screenRect);
} else {
    width = CGRectGetHeight(screenRect);
}

CustomActionSheet *actionSheet = [[CustomActionSheet alloc] init];

UIView *innerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, 216)];
[innerView setBackgroundColor:[UIColor greenColor]];
[innerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

[actionSheet setDelegate:self];
[actionSheet addContentView:innerView];

[innerView addSubview:self.colorsPickerView]; // Added your picker view here

[self.actionSheet showInView:self.view];

添加委托方法以查看控制器。关闭操作表时,将调用以下委托方法。

- (void) CustomActionSheetDoneWithUserInfo:(NSDictionary *)userInfo
{
    NSLog(@"i am in delegate method of CustomAction sheet");
}

根据您的要求自定义上述代码。

答案 2 :(得分:0)

这有点傻,但我使用的是ActionSheetPicker的过时版本。您希望确保从https://github.com/skywinder/ActionSheetPicker-3.0下载分支。