如何在ViewControllers之间传递UIButton的框架和原点

时间:2015-09-09 19:56:56

标签: ios objective-c delegates

我想做一个从日历放大的动画,特别是原点和帧大小是代表今天日期的按钮的大小。以下是在CalendarMonthView.m中确定todayButton的代码:

class iQHandler(myBaseHandler):
@tornado.gen.coroutine
def _initialize(self):
    param1 = self.get_argument('media', None)
    if not param1:
        raise tornado.web.HTTPError(404)

    # default the Output parameter to JSON format.
    outputFormat = self.get_argument('output', 'json', False)
    try:
        res = yield self._findfiles(param1)
    except Exception, e:
        # What do I do here?
        print ("Error in _initialize() routine --> ", e)
        # The variable, res, doesn't have any value if there is an exception thrown.
    raise tornado.gen.Return(res)


@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
    response = yield self._initialize()
    self.clear()
    self.finish(response)

我想获取 NSDate *date = (weekdayOffset > 0) ? [_monthStartDate dateByAddingTimeInterval:-1 * weekdayOffset * D_DAY] : _monthStartDate; BOOL bEnabled = (weekdayOffset == 0); CGRect buttonFrame = CGRectMake (0, 0, 81, 61); int idx = -1 * weekdayOffset; for (int y = 0; y < 6; y++) { buttonFrame.origin.x = 0; for (int x = 0; x < 7; x++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.tag = idx++; [button setFrame:buttonFrame]; [button setBackgroundImage:[UIImage imageNamed:@"calendarFlyout_dayContainer_today.png"] forState:UIControlStateSelected]; [button setBackgroundImage:[UIImage imageNamed:@"calendarFlyout_selected.png"] forState:UIControlStateHighlighted]; button.titleLabel.font = [UIFont fontWithName:@"TitilliumWeb-Regular" size:18.0]; button.titleLabel.textAlignment = NSTextAlignmentCenter; // TODO: optimize performance int dayOfMonth = (int)[_calendar component:NSCalendarUnitDay fromDate:date]; if (dayOfMonth < prevDayOfMonth) { bEnabled = !bEnabled; } prevDayOfMonth = dayOfMonth; [button setTitle:[NSString stringWithFormat:@"%d", dayOfMonth] forState:UIControlStateNormal]; [button setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; [button setBackgroundImage:[UIImage imageNamed:((bEnabled) ? @"calendarFlyout_dayContainer_insideMonth.png" : @"calendarFlyout_dayContainer_outsideMonth.png")] forState:UIControlStateNormal]; // button.enabled = bEnabled; button.selected = [date isToday]; if (button.selected == NO) { button.highlighted = (_currentDayDate) ? [date isEqualToDateIgnoringTime:_currentDayDate] : NO; } else { // Set buttonHolder to today } [button addTarget:self action:@selector (dayButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [_dayButtonsHolderView addSubview:button]; buttonFrame.origin.x += buttonFrame.size.width; date = [date dateByAddingTimeInterval:D_DAY]; } buttonFrame.origin.y += buttonFrame.size.height; } - (IBAction)dayButtonTapped:(id)sender { if (_delegate) { UIButton *button = (UIButton *)sender; NSDate *selectedDate = [_monthStartDate dateByAddingDays:button.tag]; [_delegate performSelector:@selector (calendarMonthView:dateSelected:) withObject:self withObject:selectedDate]; } } 的框架并在CalendarFlyoutView.m中使用的此动画中使用它。

我是iOS编程的新手,我阅读了一些代理信息并通过segue传递信息,但这似乎对我没有帮助。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果您正在从CalendarMonthViewCalendarFlyoutView制作一个segue,那么您只需将此方法添加到CalendarMonthView即可。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    CalendarFlyoutView * view = segue.destinationViewController;
    view.buttonFrame = button.frame;
}

并在CalendarFlyoutView.h

@interface CalendarFlyoutView : UIViewController

@property CGRect buttonFrame;

@end

答案 1 :(得分:0)

需要回答的几个问题才能最好地帮助您:

1)CalendarMonthView和CalendarFlyoutView是UIView还是UIViewController?你说视图控制器,但类名称不然。

2)方法'dayButtonTapped'中发生了什么?你在那里表演吗?你是以某种方式创建或加载CalendarFlyoutView的实例?

3)如果你没有使用segue,你是否以某种方式创建CalendarFlyoutView并将其添加到CalendarMonthView?

4)什么是所需的过渡(动画)? CalendarFlyoutView的大小是否与按钮的大小相同,然后填满整个屏幕?

5)是否有特定原因要设置按钮的框架而不是将其约束在正确的位置?

一旦我们对这些问题了解得多,我们就应该能够提供更具体的建议。

答案 2 :(得分:-1)

现在仍然不太清楚实际动画代码的运行位置。在您的问题中,您声明“我想获取按钮的框架并在CalendarFlyoutView.m中使用的此动画中使用它。”这似乎意味着动画代码在CalendarFlyoutView中,这似乎是一个奇怪的地方。

鉴于我对整个代码的理解不完整,我可以推荐一些东西:

1)将动画代码移动到dayButtonTapped方法,在该方法中,您已经有了对按钮的引用,因此它是框架。它似乎也是一个更合乎逻辑的地方。

2)无论你在哪里实例化CalendarFlyoutView(未在你发布的代码中显示),都要在那里指定按钮框。

3)如果只有CalendarFlyoutView的单个实例,并且您在CalendarMonthView中有对它的引用,则可以在dayButtonTapped方法中指定弹出视图的属性,该属性是您已经引用的按钮的框架。

我必须补充一点,这些只是解决结构性问题。这是一个你试图写的可重用控件吗?你为什么决定不使用故事板或查看控制器?为什么你要使用框架和绝对尺寸和位置而不是让自动布局做它的工作(你会在几个小时内撞到墙上试图调整所有方向以及所有可能的设备屏幕尺寸正确运行)。