Да, Вы можете. Люди писали объектно-ориентированный C перед C++ или , Objective C вышел на сцену. И C++ и Objective C были, в частях, попытки взять некоторые понятия OO, используемые в C и формализовать их как часть языка.
Вот действительно простая программа, которая показывает, как можно сделать что-то, что похоже / на вызов метода (существуют лучшие способы сделать это. Это, просто проверяют поддержки языка понятия):
#include
struct foobarbaz{
int one;
int two;
int three;
int (*exampleMethod)(int, int);
};
int addTwoNumbers(int a, int b){
return a+b;
}
int main()
{
// Define the function pointer
int (*pointerToFunction)(int, int) = addTwoNumbers;
// Let's make sure we can call the pointer
int test = (*pointerToFunction)(12,12);
printf ("test: %u \n", test);
// Now, define an instance of our struct
// and add some default values.
struct foobarbaz fbb;
fbb.one = 1;
fbb.two = 2;
fbb.three = 3;
// Now add a "method"
fbb.exampleMethod = addTwoNumbers;
// Try calling the method
int test2 = fbb.exampleMethod(13,36);
printf ("test2: %u \n", test2);
printf("\nDone\n");
return 0;
}
Я делаю именно то, что вы описываете в моем приложении. Это дословный код, который я использую. Он очень красиво анимирован и, кажется, прекрасно работает.
Два заявления об отказе от ответственности:
static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
// adjust this following value to account for the height of your toolbar, too
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216;
- (void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect viewFrame = self.parentView.frame;
viewFrame.origin.y += animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.parentView setFrame:viewFrame];
[UIView commitAnimations];
}
- (void) textFieldDidBeginEditing:(UITextField*) textField {
CGRect textFieldRect = [self.parentView.window convertRect:textField.bounds fromView:textField];
CGRect viewRect = [self.parentView.window convertRect:self.parentView.bounds fromView:self.parentView];
CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height;
CGFloat heightFraction = numerator / denominator;
if (heightFraction < 0.0) {
heightFraction = 0.0;
}else if (heightFraction > 1.0) {
heightFraction = 1.0;
}
animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
CGRect viewFrame = self.parentView.frame;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.parentView setFrame:viewFrame];
[UIView commitAnimations];
}
Возможно, вы могли бы изменить размер UITableView
так, чтобы он был высотой между панелью навигации и панелью инструментов над клавиатурой. , а затем прокрутить строку до отображения?
Поскольку все UITableView
также являются UIScrollView
, вы можете вызывать для них все стандартные методы прокрутки.
Что-то вроде этого будет do:
- (void)scrollTableView:(UITableView *)tableView toIndexPath:(NSIndexPath *)indexPath withBottomPadding:(CGFloat)bottomPadding
{
CGRect rectForRow = [tableView rectForRowAtIndexPath:indexPath];
CGRect bounds = [tableView bounds];
CGPoint contentOffset = [tableView contentSize];
if (rectForRow.origin.y + rectForRow.size.height > contentOffset.y + bounds.size.height - bottomPadding)
[tableView setContentOffset:rectForRow.origin.y + rectForRow.size.height - bounds.size.height - bottomPadding animated:YES];
else
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];
}
Примечание. В настоящий момент я не использую Mac с Xcode. Я протестирую этот код, когда буду