Какао: Какая разница между рамкой и границами?

Ahh ... похоже, что я был пойман одной из самых больших ошибок в WinOPI-программировании. Кроме того, публикация кода для моих объявлений функций была бы мудрой идеей в этом случае.

В любом случае, все, что мне нужно было сделать, это добавить аргумент в атрибут DllImport функции, задающей CharSet = CharSet.Unicode. Это сделало трюк как для функций CreateProcessWithLogonW, так и для CreateProcessWithTokenW. Я предполагаю, что это, наконец, просто поразило меня тем, что W-суффикс имен функций относится к Unicode и что мне нужно явно указать это на C #! Вот правильные функции в случае, если кому-то интересно:

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithLogonW(string principal, string authority,
    string password, LogonFlags logonFlags, string appName, string cmdLine,
    CreationFlags creationFlags, IntPtr environmentBlock, string currentDirectory,
    ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInfo);

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreateProcessWithTokenW(IntPtr hToken, LogonFlags dwLogonFlags,
    string lpApplicationName, string lpCommandLine, CreationFlags dwCreationFlags,
    IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo,
    out PROCESS_INFORMATION lpProcessInformation);
555
задан mk12 13 April 2016 в 06:25
поделиться

2 ответа

Границы UIView - это прямоугольник , выраженный как местоположение (x, y) и размер (ширина , высота) относительно собственной системы координат (0,0).

Кадр UIView представляет собой прямоугольник , выраженный как местоположение ( x, y) и размер (ширина, высота) относительно супервизора, в котором оно содержится.

Итак, представьте себе представление, имеющее размер 100x100 (ширина x высота), расположенное в 25,25 (x, y) его надзор. Следующий код распечатывает границы и фрейм этого представления:

// This method is in the view controller of the superview
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
    NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
    NSLog(@"bounds.size.width: %f", label.bounds.size.width);
    NSLog(@"bounds.size.height: %f", label.bounds.size.height);

    NSLog(@"frame.origin.x: %f", label.frame.origin.x);
    NSLog(@"frame.origin.y: %f", label.frame.origin.y);
    NSLog(@"frame.size.width: %f", label.frame.size.width);
    NSLog(@"frame.size.height: %f", label.frame.size.height);
}

И вывод этого кода:

bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100

frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100

Итак, мы можем видеть, что в обоих случаях ширина и высота представления одинаковы независимо от того, смотрите на границы или рамку. Отличается позиционирование вида по осям x и y. В случае границ координаты x и y равны 0,0, поскольку эти координаты относятся к самому виду. Однако координаты x и y кадра относятся к положению представления в родительском представлении (которое ранее, как мы говорили, было на 25,25).

Существует также отличная презентация , которая охватывает UIViews . См. Слайды 1-20, на которых не только объясняется разница между рамками и границами, но и показаны наглядные примеры.

877
ответ дан 22 November 2019 в 22:11
поделиться

Позвольте мне добавить свои 5 центов.

Кадр используется родительским представлением представления для размещения его в родительском представлении.

Границы используются самим представлением для размещения, свое собственное содержание (как представление прокрутки делает при прокрутке). См. также clipsToBounds. Границы также могут привыкнуть к увеличению / контент представления.

2
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: