2011-11-07 247 views
2

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

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 
+0

嘿,只是一个问题。我可以在我的项目中使用你的代码吗?我需要完全一样的东西。非常感谢 – Youssef

回答

3

没有人,但苹果可以充分地回答这个问题,所以最好的办法是把它放到测试。我认为您必须问自己的主要问题是:我违反了Apple开发人员协议中的任何规定吗?如果没有,请提交您的应用程序。如果您担心拒绝,请考虑采取其他方式作为备份,并准备在出现问题时提交。

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

+0

太好了,谢谢。我将包括“也”一词。顺便说一句,我只是把这个页面发布到苹果的一个问题上,所以很快我就会回答。 – Geri

+0

我改变了上面屏幕截图中的单词。 :) – Geri

+0

叶'这不是太“自然”,但比从零开始创建一个UIAlertView更好。 – Geri

4

的实际问题的答案是没有 - 苹果不允许UIAlertView中要被继承。从UIAlertView中的文档:

子类注

的UIAlertView中类拟用作原样,并且不支持 子类。该类的视图层次结构是私有的,并且不得修改 。

这里找到: Subclassing UIAlertView