是否允许Apple定制UIAlertView?

时间:2011-11-07 17:24:53

标签: ios app-store uialertview appstore-approval

我准备通过继承UIAlerView来提交这样的自定义。它的布局完全基于UIAlertView的给定地形,没有读取任何私有财产。 App Store审核流程是否接受这种自定义?

enter image description here

BGAlertViewWithSwitch.h

//
//  BGAlertViewWithSwitch.h
//  BGAlertViewWithSwitch
//
//  Created by Borbas Geri on 11/7/11.
//  Copyright 2011 ©ompactApps. All rights reserved.
//

#import <Foundation/Foundation.h>


//An assumed value.
#define ALERT_VIEW_LINE_HEIGHT 20.0
#define ALERT_VIEW_LABEL_PADDING 5.0
#define ALERT_VIEW_LABEL_ALPHA 0.5

#define kAlertSwitchLabelTag 42


@interface BGAlertViewWithSwitch : UIAlertView 
{
    UISwitch *_alertSwitch;
    UILabel *_alertSwitchLabel;
}
@property (nonatomic, retain) UISwitch *alertSwitch;
@property (nonatomic, retain) UILabel *alertSwitchLabel;
@property (nonatomic, readonly, getter=isOn) BOOL on;

-(id)initWithTitle:(NSString*) title
           message:(NSString*) message
     switchMessage:(NSString*) switchMessage
          delegate:(id) delegate
 cancelButtonTitle:(NSString*) cancelButtonTitle
     okButtonTitle:(NSString*) okButtonTitle;

@end

BGAlertViewWithSwitch.m

//
//  BGAlertViewWithSwitch.m
//  BGAlertViewWithSwitch
//
//  Created by Borbas Geri on 11/7/11.
//  Copyright 2011 ©ompactApps. All rights reserved.
//


#import "BGAlertViewWithSwitch.h"


@implementation BGAlertViewWithSwitch
@synthesize alertSwitch = _alertSwitch;
@synthesize alertSwitchLabel = _alertSwitchLabel;


#pragma mark - UISwitch Accessor

-(BOOL)isOn
{
    return self.alertSwitch.isOn;
}


#pragma mark - View lifecycle

-(id)initWithTitle:(NSString*) title
           message:(NSString*) message
     switchMessage:(NSString*) switchMessage
          delegate:(id) delegate
 cancelButtonTitle:(NSString*) cancelButtonTitle
     okButtonTitle:(NSString*) okButtonTitle
{

    //For testing layout
    NSString *placeHolder = @"";

    //Append a line to the message that leaves the place for the switch. 
    NSString *_expandedMessage = [NSString stringWithFormat:@"%@\n%@\n%@\n", message, placeHolder, placeHolder];

    if (self = [self initWithTitle:title
                           message:_expandedMessage
                          delegate:delegate
                 cancelButtonTitle:cancelButtonTitle
                 otherButtonTitles:okButtonTitle, nil])
    {
        //Add switch.
        self.alertSwitch = [[UISwitch alloc] init];
        self.alertSwitch.on = YES; 
        [self addSubview:self.alertSwitch];

        //Add label.
        self.alertSwitchLabel = [[UILabel alloc] init];
        self.alertSwitchLabel.text = switchMessage;
        self.alertSwitchLabel.tag = kAlertSwitchLabelTag;
        [self addSubview:self.alertSwitchLabel];
    }
    return self;
}

- (void)dealloc
{
    self.alertSwitch = nil;
    self.alertSwitchLabel = nil;

    [super dealloc];
}


#pragma mark - Topography

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews to (%@)", NSStringFromCGRect(self.frame));

    //Weak link to the message label.
    UILabel *messageLabel;

    //Enumerate subviews to find message label (the base of the topography).
    for (UIView *eachSubview in self.subviews)
        if ([[eachSubview class] isEqual:[UILabel class]])
        {
            UILabel *eachLabel = (UILabel*)eachSubview;
            if (eachLabel.tag != kAlertSwitchLabelTag)
            {
                messageLabel = eachLabel;
                NSLog(@"Each label frame (%@), saying '%@'", NSStringFromCGRect(eachLabel.frame), eachLabel.text);                
            }
        }

    //Center new content.
    CGSize alertSwitchLabelSize = [self.alertSwitchLabel.text sizeWithFont:messageLabel.font];
    float horizontalCentering = (messageLabel.frame.size.width - (alertSwitchLabelSize.width + ALERT_VIEW_LABEL_PADDING + self.alertSwitch.frame.size.width)) / 2;


    //Switch goes to the bottom right.
    float switchVerticalCentering = ((ALERT_VIEW_LINE_HEIGHT * 2 + 1) - self.alertSwitch.frame.size.height ) / 2;
    CGRect alertSwitchFrame = CGRectMake(messageLabel.frame.origin.x + messageLabel.frame.size.width - self.alertSwitch.frame.size.width - horizontalCentering,
                                         messageLabel.frame.origin.y + messageLabel.frame.size.height - self.alertSwitch.frame.size.height - switchVerticalCentering,
                                         self.alertSwitch.frame.size.width,
                                         self.alertSwitch.frame.size.height);
    self.alertSwitch.frame = alertSwitchFrame;

    //Label goes to the bottom left.    
    float switchLabelVerticalCentering = ((ALERT_VIEW_LINE_HEIGHT * 2 + 1) - ALERT_VIEW_LINE_HEIGHT ) / 2;
    CGRect alertSwitchLabelFrame = CGRectMake(round( messageLabel.frame.origin.x + horizontalCentering ),
                                              round( messageLabel.frame.origin.y + messageLabel.frame.size.height - ALERT_VIEW_LINE_HEIGHT - switchLabelVerticalCentering ),
                                              messageLabel.frame.size.width - self.alertSwitch.frame.size.width,
                                              ALERT_VIEW_LINE_HEIGHT); //self.alertSwitchLabel.frame.size.height);
    self.alertSwitchLabel.frame = alertSwitchLabelFrame;

    //Copy message label properties.
    self.alertSwitchLabel.backgroundColor = [UIColor clearColor];   
    self.alertSwitchLabel.textColor = messageLabel.textColor;
    self.alertSwitchLabel.font = messageLabel.font;
    self.alertSwitchLabel.shadowColor = messageLabel.shadowColor;
    self.alertSwitchLabel.shadowOffset = messageLabel.shadowOffset;

    //Weaken.
    self.alertSwitchLabel.alpha = ALERT_VIEW_LABEL_ALPHA;

    [super layoutSubviews];
}


@end

2 个答案:

答案 0 :(得分:4)

问题的实际答案是 - Apple不允许 UIAlertView 进行子类化。来自UIAlertView文档:

  

子类注释

     

UIAlertView类旨在按原样使用,但不是   支持子类化。此类的视图层次结构是私有的   不得修改。

在这里找到: Subclassing UIAlertView

答案 1 :(得分:3)

除了Apple之外,没有人可以充分回答这个问题,所以最好的办法是对它进行测试。我认为你要问自己的主要问题是:我是否违反了Apple开发者协议中的任何条款?如果没有,请提交您的应用。如果您担心拒绝,请考虑另一种可以做到这一点的方式,作为备份,并准备好在出现问题时提交。

并非你曾经问过,但我也认为这种对Apple设计的改变不是很直观。你的意思是转换为“也从moquus删除?”因为你已经有一个很大的删除按钮。如果开关关闭,那么删除按钮会删除什么?