Является ли настройка UIAlertView разрешенной Apple?

Я готовлюсь представить такую ​​настройку, создав подкласс UIAlerView. Его компоновка полностью основана на заданной топографии UIAlertView, не имеет никакого частного свойства read. Является ли этот вид настройки приемлемым в процессе проверки в App Store?

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 ответа

Решение

Никто, кроме Apple, не может адекватно ответить на этот вопрос, поэтому лучше всего проверить его. Я думаю, что главный вопрос, который вы должны задать себе: нарушил ли я какие-либо положения Соглашения Apple для разработчиков? Если нет, то подайте заявку. Если вы беспокоитесь об отказе, подумайте о другом способе сделать это, в качестве резервной копии, и будьте готовы предоставить его в случае возникновения проблемы.

Не то чтобы вы спрашивали, но я бы также высказал мнение, что это изменение дизайна Apple не очень интуитивно понятно. Вы имеете в виду, что переключатель означает "также удалить из moquus?" поскольку у вас уже есть большая кнопка удаления. Если переключатель выключен, то что удаляет кнопка удаления?

Фактический ответ на этот вопрос - нет - Apple не позволяет UIAlertView разделять на подклассы. Из документов UIAlertView:

Примечания по подклассам

Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представления для этого класса является закрытой и не должна быть изменена.

Найдено здесь: подкласс UIAlertView

Другие вопросы по тегам